首页> C#>在后台运行方法和UI线程WPF
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了首页> C#>在后台运行方法和UI线程WPF,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2272字,纯文字阅读大概需要4分钟。
内容图文
![首页> C#>在后台运行方法和UI线程WPF](/upload/InfoBanner/zyjiaocheng/664/7b8fbfcba86a4b83a553444ad3ea6cd1.jpg)
我在以下示例中遇到了麻烦:
public void Method()
{
LongRunningMethod();
}
LongRunningMethod()大约需要5秒钟才能调用.我正在从UI线程调用Method(),因此它显然应该冻结UI.解决方案是在新Task中运行Method(),因此我将这样运行它:
Task.Factory.StartNew(()=>{Method()})
它仍然阻止UI,所以我认为LongRunningMethod()是否正在使用UI上下文.然后我尝试了另一种解决方案:
新的Thread(()=> Method()).Start()
它开始工作.那怎么可能?我知道不能保证Task在不同的线程上运行,但是CLR应该足够聪明才能弄清楚它是长期运行的方法.
解决方法:
您正在安排用户界面(UI)线程上的工作,原因是您正在使用
此代码中的TaskScheduler.FromCurrentSynchronizationContext()):
Task nextTask = task.ContinueWith(x =>
{
DoSomething();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
task.Start();
}
这就是您的UI被冻结的原因.为了防止尝试将TaskScheduler更改为Default:
Task task = Task.Run(() => {; });
Task nextTask = task.ContinueWith(x =>
{
//DoSomething();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Default);
Task.Factory.StartNew is dangerous,因为它使用TaskScheduler.Current而不是TaskScheduler.Default.为避免这种情况,请使用Task.Run,??它始终指向TaskScheduler.Default. Task.Run是.NET 4.5中的新增功能,如果您位于.NET 4.0中,则可以使用默认参数创建TaskFactory.
TaskScheduler.FromCurrentSynchronizationContext())
means schedule
a task on the same thread that the user interface (UI) control was
created on.
更新:
运行方法RunTask()时会发生什么:
> var task = new Task(action,cancellingTokenSource.Token);
创建一个“任务”. (任务未运行.“任务”仅被查询到ThreadPool.)
>任务nextTask = task.ContinueWith(x =>
{
做一点事();
},CancellationToken.None,TaskContinuationOptions.OnlyOnRanToCompletion,TaskScheduler.FromCurrentSynchronizationContext());
创建一个“ nextTask”,它将在“任务”完成后开始执行,并且在您设置功能后将在UI线程上执行“ nextTask”
TaskScheduler.FromCurrentSynchronizationContext().
> task.Start();
您运行“任务”.完成“任务”后,将通过方法“ task.ContinuuWith()”运行“ nextTask”,该方法将在您编写的UI线程上执行(TaskScheduler.FromCurrentSynchronizationContext()
综上所述,您的两个任务是相互关联的,并且任务的延续是在UI线程上执行的,这是冻结UI的原因.若要防止此行为,请使用TaskScheduler.Default.
内容总结
以上是互联网集市为您收集整理的首页> C#>在后台运行方法和UI线程WPF全部内容,希望文章能够帮你解决首页> C#>在后台运行方法和UI线程WPF所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。