C# 处理iAsyncope和Progress的最干净的方法?

C# 处理iAsyncope和Progress的最干净的方法?,c#,.net,asynchronous,windows-runtime,async-await,C#,.net,Asynchronous,Windows Runtime,Async Await,我使用C已经有一段时间了,但不知怎么的,我还没有享受到使用.NET4中全新的wait/async的乐趣。现在,我正在制作一个控制台应用程序,它链接到WinRT库,WinRT实际上是。。嗯,异步的 我现在需要做的一件事是安装一个软件包。因此,我使用PackageManager.AddPackageAsync这当然是异步的,并返回一个IAsyncperationwithProgress 我知道我可以做类似的事情 bool Done=false; void Foo() { var tmp=ne

我使用C已经有一段时间了,但不知怎么的,我还没有享受到使用.NET4中全新的wait/async的乐趣。现在,我正在制作一个控制台应用程序,它链接到WinRT库,WinRT实际上是。。嗯,异步的

我现在需要做的一件事是安装一个软件包。因此,我使用PackageManager.AddPackageAsync这当然是异步的,并返回一个IAsyncperationwithProgress

我知道我可以做类似的事情

bool Done=false;
void Foo()
{
    var tmp=new PackageManager.AddPackageAsync(...);
    tmp.Completed= ... FooBar;
    while(!Done){}
}
void FooBar(...)
{
    Done=true;
}
但是我很确定整个异步等待的设计就是为了这个场景。但是,我不明白如何在IAsyncOperationWithProgress的上下文中使用它。Net包含一个GetAwaiter扩展方法,使IAsyncOperationWithProgress成为可等待的。 你可以只写等待tmp;在异步方法中


您的异步方法将返回一个或多个任务,您可以从另一个异步方法等待该任务,也可以调用Wait以同步阻止。

async and Wait允许您编写异步操作,就像它发生在调用线程上一样。首先,您必须声明您的操作是异步的,然后等待另一个人的异步操作。最后,在操作完成后,您可以做任何您想做的工作

async void Foo()
{
  var tmp=await new PackageManager().AddPackageAsync(...);
  //do something else;
}
调用Foo将使其在后台运行,但当AddPackageAsync完成时,Foo将重新加入调用线程(例如UI线程)以完成其工作


另一个选项是调用GetAwaiter扩展方法并调用Wait对其进行手动阻止,直到操作完成。

您可以使用AsTask方法的重载来订阅该进度,如下所示


…=等待新的PackageManager.AddPackageAsync…AsTasknew Progress

在添加对System.Runtime.WindowsRuntime的引用后,我得到错误System.Runtime.CompilerServices'不包含IsCompletedAh的定义,还必须添加对WinRT版本中System.Threading.Tasks的引用。。从桌面应用程序链接到WinRT是一个非常黑暗的领域heh@Earlz遇到同样的问题,我在哪里可以找到System.Threading.Tasks的WinRT版本?@Stevestiffler:Try我添加了引用,但问题仍然存在。我问了一个问题,这里有更多的细节: