AsAsyncAction VS Task.Run

时间:2016-05-19 10:01:32

标签: c# c#-4.0 async-await iasyncoperation

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

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带来的好处是什么?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

  • .NET Framework受以下版本支持:4.6,4.5
  • .NET for Windows Phone应用程序:受支持: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将优先于任何其他任务