每当我必须开始并行任务时,我通常会这样做:
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带来的好处是什么?
答案 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
如果将此与“任务”进行比较,您将看到
这会立即告诉您IAsyncAction是专为WinRT创建的,这是MS在移动应用程序框架上的第一次真正尝试,因为完整的.net框架功能太强大,无法在移动设备上安全地创建并行缩减框架会使编写可能损坏设备的恶意软件变得更加困难
因此,如果您使用的是WinRT,则返回IAsyncAction将优先于任何其他任务