繁体   English   中英

AsAsyncAction VS Task.Run

[英]AsAsyncAction VS Task.Run

每当我必须开始并行任务时,我通常都会这样做:

public async Task FindPerson(string personId)
{
    await Task.Run(() =>
    {
        //Search the person and write to screen 
    });
} 

但是通常我会看到其他使用AsAsyncOperation的编码器:

public IAsyncAction FindPerson(string personId)
{
    Task t = new Task(() =>
    {
        //Search the person and write to screen 
    });
    t.Start();
    return t.AsAsyncAction();
}

有没有人知道与使用全新的异步/等待相比,AsAsyncAction带来了什么好处

AsAsyncAction用于将任务转换为IAsyncAction ,以传递给WinRT。 如果您不使用WinRT,则没有理由使用此扩展。

您也不应创建任务然后再启动它。 在几乎所有情况下,都首选Task.Run

您也不应该创建异步方法来仅使用Task.Run在其中。 调用者希望此方法是异步的,但它所做的只是将同步工作卸载到ThreadPool 如果调用者需要在ThreadPool上工作,最好让他们在代码中使用Task.Run

所以基本上就是这样做:

public void FindPerson(string personId)
{
    // Search the person and write to screen 
}

并让调用者同步地或在ThreadPool线程上调用此方法:

Task.Run(() => FindPerson(personId));

如果您查看MSDN页面,您将看到IAsyncAction

  • .NET Framework受以下版本支持:4.6、4.5
  • 适用于Windows Phone应用程序的.NET:受支持:Windows Phone Silverlight 8

如果将此与“任务”进行比较,您将看到

  • 通用Windows平台:从4.5开始可用
  • .NET Framework:从4.0开始可用
  • 可移植类库受支持:可移植.NET平台
  • Silverlight:从5.0开始可用
  • Windows Phone Silverlight从8.0开始可用
  • Windows Phone从8.1开始可用

这会立即告诉您IAsyncAction是专为WinRT创建的,这是MS在移动应用程序框架上的首次真正尝试,因为完整的.net框架功能强大,无法在移动设备上安全,因此他们创建了并行缩减框架,从而使之成为现实。编写可能损坏设备的恶意软件要困难得多

因此,如果您使用的是WinRT,则在其他任务中首选返回IAsyncAction

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM