wpf异步写入文件的方法

wpf异步写入文件的方法,第1张

写数据传给前台的时候老是卡死,发现用了这个方法也不行,然后发现要再最上层套上TaskRun()才行,在此记录下。

首先把流程源码放出来 这些代码也包含了一个定时器和记录前台显示,每天几点执行一次,需要拿去,从最底层开始

<Button

x:Name="btnStart"

Width="100"

Height="30"

Margin="5"

HorizontalAlignment="Left"

Click="btnStart_Click"

Content="启动" />

<TextBox

Name="txtLog"

GridRow="1"

GridColumnSpan="2"

AcceptsReturn="True"

Foreground="Black"

HorizontalScrollBarVisibility="Auto"

TextWrapping="Wrap"

VerticalScrollBarVisibility="Auto" />

然后到数据层

public async Task Execute(string[] args)

{

try

{

await TaskRun(() =>

{

LoadDisplay("你迟到了");

});

}

catch (Exception e)

{

//LoadDisplay($"请求接口时出现异常{eMessage}");

}

}

/// <summary>

/// 输出日志信息

/// </summary>

/// <param name="news"></param>

public void LoadDisplay(string news)

{

thistxtLogDispatcherBeginInvoke((Action)delegate

{

thistxtLogAppendText(DateTimeNowToString("yyyy-MM-dd HH:mm:ss " + news + "\r\n"));

if (IsVerticalScrollBarAtBottom)

{

thistxtLogScrollToEnd();

}

});

}

调用层

复制代码

/// <summary>

/// //要执行的任务

/// </summary>

/// <param name="state"></param>

private async void DoTask(object state)

{

string[] args = new string[0];

//执行功能

await Execute(lines);

//再次设定

SetTaskAtFixedTime();

}

复制代码

开始new一个计时器

复制代码

/// <summary>

/// //设定定时执行

/// </summary>

public void SetTaskAtFixedTime()

{

DateTime now = DateTimeNow;

DateTime oneOClock = DateTimeTodayAddHours(70); //晨7:00

if (now > oneOClock)

{

oneOClock = oneOClockAddDays(10);

}

int msUntilFour = (int)(oneOClock - now)TotalMilliseconds;

var t = new SystemThreadingTimer(DoTask);

tChange(msUntilFour, TimeoutInfinite);

}

复制代码

最后 按钮点击事件

1000行的数据一次显示是不科学的,最好的方式是分页显示,每页20行左右,简单可行。

第二种方式是缓存的形式,类似于微博那样,先显示前50行,当下拉到45行时,加载51—100行的内容

最后一种方式是多线程方式,第一条线程加载页面控件,第二条线程加载前50行内容(保证用户体验),第三条线程加载余下的内容

程序的 假死 和 缩短响应时间  是两个概念,处理的方式也不同。

1、造成假死的原因一般只有一个,就是界面线程阻塞的。

WPF、Winform应用默认是只有一个线程的,即UI线程。 当你把某些比较耗时的代码写入事件,那么UI线程就会阻塞,体现给用户的就是“界面卡死了”。

解决方案很简单,使用后台线程处理耗时的任务,让UI线程保持畅通即可。

示例代码:

void Button1_Click(object sender, RoutedEventArgs e)

{

var thread = new SystemThreadingThread(new SystemThreadingThreadStart(() =>  {

      //这里面写那些很耗时的代码,比如数据库查询之类的

      //后台线程不要去写前端的代码,不要写针对控件的 *** 作,

        //尤其是 TextBlockText = 'xxx'这种,  这种要用委托去做,自行百度

})) { IsBackground = true };

threadStart();

}

2、减少响应时间

这个太宽泛了,很难具体回答, 一般的业务系统会从两方面着手,

一是从代码中优化,减少冗余的代码,减少同一个事件中多次交互性 *** 作,避免多次查询等等。

二是从数据库优化,这个要看数据库工程师的能力了。简单的可以加索引、读写分离,比较复杂的系统可能需要数据库工程师搭建更好的架构。

额, 哪有你这样搞的

可以用 BackgroundWorker 来处理任务, 通过 ProgressChanged 事件来报告进度

等我下班了给你做个 Demo, 你也可以先试试

你好,

“要是这个程序一直开着并且有人一直在用,占用的内存就会越来越多直到不可挽回”

这句话我是相当的不理解……发生这样的事,与WPF没有关系吧?应该是程序本身编写的问题导致内存泄露。

GC会自动调出了作用域的类的析构,即使没有写Finalize,也会直接继承基类的析构函数的,怎么可能有内存一定释放不掉?

所以,问题只能是变量一直没出作用域,也就是设计上的问题。不知道你的系统是什么类型,如果可能,希望你能补充下问题。

==========================================

MSDN中关于NavigationService类的说明:

By default, NavigationService does not store an instance of a content object in navigation history Instead, NavigationService creates a new instance of the content object each time it is navigated to by using navigation history This behavior is designed to avoid excessive memory consumption when large numbers and large pieces of content are being navigated to Consequently, the state of the content is not remembered from one navigation to the next

默认状况下,NavigationService并不会在导航历史中保存任何导向的目标内容类的实例,作为替代,它每次都创建目标内容的新实例并保存在导航历史中。这个特性被设计用来防止当导航到大的(占内存大的)的成员或内容页时过度的内存消耗。当然,内容页的状态在导航中不会被保存。

=======分割一下,下面是我说的=====

其实NavigationService就是一个经过改进的特殊的Command模式实现,所做的改进正是为了防止内存消耗。而正因为它是Command模式的实现,它在导航过程中一定会保存与导航次数相等的类,只不过它并没有保存这些类的状态而已。

举个例子,按这个方式导航:Page1->Page2->Page3->Page2->Page4

此时,WPF内部将保存有5个类的实例

所以……导航次数与WPF中保存的Page类(或你的其他页面类)的关系是线性增长的:

Count(PageClass In Memory) = Navigation Times

而且,最过分的是,我没有看到关于BackStack和FowardStack大小的说明。

============再分割一下==============

我以前还真没认真看过方面,写了个代码测试了下,导航过程中增加的内存很小很小。

所以,我觉得你应该可以试着优化一下页面结构,尽量少放静态的内容在里面。

BTW,大概在MS眼中,每个服务器都应该有1TB内存……

MSDN中关于导航的说明:

>

我最近安装了VS2011,其他一切正常,就是在调试WPF程序中,会d出无法找到IE这个提示框,然后确定就终止了,但是在项目上点击使用在浏览器中查看则会又正常d出360浏览器,我曾经将IE改为默认浏览器,但是还是不行。

望有高手解答

系统:Windows 7 旗舰版

IDE:Visual Studio 旗舰版

系统盘符:C:

默认程序安装路径:D:\Program Files

已经将原系统C盘下Program Files程序中偿恭稗枷织磺半委报莲所有程序拷贝到D盘的相应文件夹中了

小弟在此先拜谢,希望有过相关经验和熟悉此IDE来解答,拒绝混分的

英文版的呢,楼主强人!提示很明显了,你某一个Border的边框颜色设置的值有问题,所以导致视图不能正确加载。你检查一下,是不是颜色值代码没写全,或是使有了自定义的资源中的颜顶肠侈段侬灯畴犬川华色而没有加载资源字典,导致系统不能识别这个颜色引起的

以上就是关于wpf异步写入文件的方法全部的内容,包括:wpf异步写入文件的方法、WPF界面数据延迟显示问题、C#怎么减少假死,等待响应时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10091800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存