在UI线程上创建和启动任务当在工作线程上调用的方法需要在UI线程上运行代码并等待它完成后再执行其他操作,你可以这样做:publicintRunOnUi(Funcf){intres=Application.Current.Dispatcher.Invoke(f);返回资源;但是如果我想使用任务怎么办?有没有办法让RunOnUi方法创建一个在UI上启动的任务并返回它,以便调用者(在工作线程上运行)可以等待它?适合以下签名的东西:publicTaskStartOnUi(Funcf)?一种方式如下:publicTaskRunOnUi(Funcf){vartask=newTask(f);task.Start(_scheduler);回归任务;在这里,假设_schduler持有uiTaskScheduler。但是我不太习惯创建“冷”任务并使用start方法来运行它们。这是“推荐”的方式还是有更优雅的方式来做到这一点?只需使用InvokeAsync而不是Invoke,然后返回函数返回的DispatcherOperation的Task。//编码约定说异步函数应该以单词Async结尾。publicTaskRunOnUiAsync(Funcf){vardispatcherOperation=Application.Current.Dispatcher.InvokeAsync(f);返回dispatcherOperation.Task;如果您无法访问.NET4.5,它会更复杂。您将需要使用BeginInvoke和TaskCompletionSource来包装由BeginInvoke返回的DispaterOperation。以上就是C#学习教程的全部内容:在UI线程上创建和启动任务。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注—publicTaskRunOnUi(Funcf){varoperation=Application.Current.Dispatcher.BeginInvoke(f);vartcs=newTaskCompletionSource();operation.Aborted+=(sender,args)=>tcs.TrySetException(newSomeExecptionHere());operation.Completed+=(sender,args)=>tcs.TrySetResult((int)operation.Result);//操作可能已经完成,并且此检查说明了//两个事件都不会被调用的竞争条件//因为事件是在您订阅之前引发的。varstatus=operation.Status;如果(状态==DispatcherOperationStatus.Completed){tcs.TrySetResult((int)operation.Result);}elseif(status==DispatcherOperationStatus.Aborted){tcs.TrySetException(newSomeExecptionHere());}返回tcs.Task;}本文收集自网络,不代表表态,如涉及侵权,请点击右侧联系管理员删除如转载请注明出处:
