0

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

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

4

2 回答 2

3

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));
于 2016-05-19T10:26:25.057 回答
0

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

  • .NET Framework 支持:4.6、4.5
  • .NET for Windows Phone 应用程序:受支持:Windows Phone Silverlight 8

如果您将此与 Task 进行比较,您将看到

  • 通用 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

于 2016-05-19T10:27:37.980 回答