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();
}

有谁知道与使用全新的 async/await 相比, 好处 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
  • .NET for Windows Phone 应用程序:受支持:Windows Phone Silverlight 8

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

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

这立即告诉你 IAsyncAction 是专门为 WinRT 创建的,这是 MS 在移动应用程序框架上的第一次真正尝试,因为完整的 .net 框架太强大了,在移动设备上是安全的,他们创建了一个并行削减使编写可能损坏设备的恶意软件变得更加困难的框架

因此,如果您使用的是 WinRT,那么返回 IAsyncAction 将是首选任务