如何同步运行异步任务<T>方法?

如何同步运行异步任务<T>方法?

我正在学习异步/等待,并遇到需要同步调用异步方法的情况。我怎么能这么做?

异步方法:

public async Task<Customers> GetCustomers(){
    return await Service.GetCustomersAsync();}

正常使用:

public async void GetCustomers(){
    customerList = await GetCustomers();}

我尝试使用以下方法:

Task<Customer> task = GetCustomers();task.Wait()Task<Customer> task = GetCustomers();task.RunSynchronously();
Task<Customer> task = GetCustomers();while(task.Status != TaskStatus.RanToCompletion)

我还从这里但是,当调度程序处于挂起状态时,它无法工作。

public static void WaitWithPumping(this Task task) {
        if (task == null) throw new ArgumentNullException(“task”);
        var nestedFrame = new DispatcherFrame();
        task.ContinueWith(_ => nestedFrame.Continue = false);
        Dispatcher.PushFrame(nestedFrame);
        task.Wait();}

下面是调用的异常和堆栈跟踪RunSynchronously:

System.InvalidOperationException

讯息:对于未绑定到委托的任务,可能不会同步调用。

InnerException*空

来源*姆斯科利布

斯塔克迹:

        at System.Threading.Tasks.Task.InternalRunSynchronously(TaskScheduler scheduler)
   at System.Threading.Tasks.Task.RunSynchronously()
   at MyApplication.CustomControls.Controls.MyCustomControl.CreateAvailablePanelList() in C:\Documents and Settings\..
   .\MyApplication.CustomControls\Controls\MyCustomControl.xaml.cs:line 638
   at MyApplication.CustomControls.Controls.MyCustomControl.get_AvailablePanels() in C:\Documents and Settings\.
   ..\MyApplication.CustomControls\Controls\MyCustomControl.xaml.cs:line 233
   at MyApplication.CustomControls.Controls.MyCustomControl.<CreateOpenPanelList>b__36(DesktopPanel panel) in C
   :\Documents and Settings\...\MyApplication.CustomControls\Controls\MyCustomControl.xaml.cs:line 597
   at System.Collections.Generic.List`1.ForEach(Action`1 action)
   at MyApplication.CustomControls.Controls.MyCustomControl.<CreateOpenPanelList>d__3b.MoveNext() in C:\Documents and Settings
   \...\MyApplication.CustomControls\Controls\MyCustomControl.xaml.cs:line 625


一只斗牛犬
浏览 874回答 3
3回答

阿晨1998

建议这个答案已经三年了。我编写它的大部分是基于.NET 4.0的体验,很少使用4.5,特别是async-await..一般来说,这是一个很好的简单的解决方案,但它有时会破坏一些东西。请阅读评论中的讨论。.净4.5就用这个://&nbsp;For&nbsp;Task<T>:&nbsp;will&nbsp;block&nbsp;until&nbsp;the&nbsp;task&nbsp;is&nbsp;completed...var&nbsp;result&nbsp;=&nbsp;task.Result;&nbsp; //&nbsp;For&nbsp;Task&nbsp;(not&nbsp;Task<T>):&nbsp;will&nbsp;block&nbsp;until&nbsp;the&nbsp;task&nbsp;is&nbsp;completed...task2.RunSynchronously();见:任务服务生,&nbsp;任务结果,&nbsp;任务同步运行.net 4.0用这个:var&nbsp;x&nbsp;=&nbsp;(IAsyncResult)task;task.Start();x.AsyncWaitHandle.WaitOne();.或者这个task.Start();task.Wait();
打开App,查看更多内容
随时随地看视频慕课网APP