我一直在使用C#已经有一段时间了,但不知何故还没有使用.Net 4中新的await/async
新东西的乐趣。好吧,现在我正在创建一个链接的控制台应用程序到WinRT库和WinRT真的......好吧,异步。
我现在需要做的一件事就是安装一个包。所以,我使用PackageManager.AddPackageAsync
这当然是异步的,并返回IAsyncOperationWithProgress
我知道我可以做类似
的事情bool Done=false;
void Foo()
{
var tmp=new PackageManager.AddPackageAsync(...);
tmp.Completed= ... FooBar;
while(!Done){}
}
void FooBar(...)
{
Done=true;
}
但是我很确定整个异步和等待事情都是针对这种情况而设计的。但是,我不明白如何在IAsyncOperationWithProgress
答案 0 :(得分:3)
.Net包含GetAwaiter()
扩展方法,可使IAsyncOperationWithProgress
等待。
您只需在await tmp;
方法中编写async
。
您的async
方法将返回Task
(或Task<T>
),您可以从另一个异步方法await
返回,或致电Wait()
同步阻止
答案 1 :(得分:2)
Async和Await允许您编写Async操作,就像它在调用线程上发生一样。首先,您必须将操作声明为异步,然后等待来自其他人的异步操作。最后,在完成该操作后,您将完成您想要做的任何工作。
async void Foo()
{
var tmp=await new PackageManager().AddPackageAsync(...);
//do something else;
}
调用Foo将使其在后台运行,但是当AddPackageAsync完成时,Foo重新加入调用线程(例如UI线程)以完成其工作。
另一种选择是调用GetAwaiter扩展方法并在其上调用Wait()以手动阻塞,直到操作完成。
答案 2 :(得分:2)
您可以使用AsTask方法的重载来订阅该进度,如下所示
...= await new PackageManager().AddPackageAsync(...).AsTask(new Progress<DeploymentProgress>(...))
;