Mis*_*tyK 5 c# wpf multithreading task task-parallel-library
我在使用以下示例时遇到问题:
public void Method()
{
LongRunningMethod();
}
Run Code Online (Sandbox Code Playgroud)
LongRunningMethod()调用大约需要 5 秒。我是Method()从 UI 线程调用的,所以它显然应该冻结 UI。解决方案是Method()在新的环境中运行Task,所以我像这样运行它:
Task.Factory.StartNew(()=>{Method()})
Run Code Online (Sandbox Code Playgroud)
它仍然阻塞 UI,所以我想是否LongRunningMethod()可能使用 UI 上下文。然后我尝试了另一种解决方案:
new Thread(()=>Method()).Start()
它开始起作用了。这怎么可能?我知道这Task不能保证在不同的线程上运行,但CLR应该足够聪明来找出它是长时间运行的方法。
您正在安排用户界面 (UI) 线程上的工作,因为您
TaskScheduler.FromCurrentSynchronizationContext())在此代码中使用:
Task nextTask = task.ContinueWith(x =>
{
DoSomething();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
task.Start();
}
Run Code Online (Sandbox Code Playgroud)
这就是你的用户界面被冻结的原因。为了防止尝试更改TaskScheduler为Default:
Task task = Task.Run(() => {; });
Task nextTask = task.ContinueWith(x =>
{
//DoSomething();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Default);
Run Code Online (Sandbox Code Playgroud)
Task.Factory.StartNew是危险的,因为它使用的TaskScheduler.Current不是TaskScheduler.Default. 为了防止这种情况,使用Task.Run始终指向TaskScheduler.Default. 是 .NET 4.5 中的新功能,如果您使用的是 .NET 4.0,则可以使用默认参数Task.Run创建您的。TaskFactory
TaskScheduler.FromCurrentSynchronizationContext())表示在创建用户界面 (UI) 控件的同一线程上安排任务。
更新:
运行方法 RunTask() 时会发生什么:
var task = new Task(action, cancellationTokenSource.Token);
创建一个“任务”。(任务未运行。“任务”只是排队到线程池中。)
Task nextTask = task.ContinueWith(x =>
{
DoSomething();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
创建一个“nextTask”,它将在“task”完成后开始执行,并且“nextTask”将在您设置功能时在 UI 线程上执行
TaskScheduler.FromCurrentSynchronizationContext()。
task.Start();你运行你的“任务”。当“task”完成时,“nextTask”将通过“task.ContinuuWith()”方法运行,该方法将在您编写的UI线程上执行(TaskScheduler.FromCurrentSynchronizationContext()
总而言之,您的两个任务是相互关联的,并且task在 UI 线程上继续执行,这是冻结您的 UI 的原因。为了防止这种行为,请使用TaskScheduler.Default.
| 归档时间: |
|
| 查看次数: |
2455 次 |
| 最近记录: |