await / async issues
本文关键字:issues async await | 更新日期: 2023-09-27 18:27:51
我正在使用Windows 8 CP,发现在我的应用程序中,我无法正确地让新的异步/等待机制工作。
我向您展示的这个方法在作为UnitTest(从单元测试中调用)运行时会起作用,但在正常运行时,它不起作用!
StreamSocket _client;
private void Start() {
SomeMethod();
SomeOtherMethod();
}
private async void SomeMethod(string sample)
{
var request = new GetSampleRequestObject(sample);
byte[] payload = ConvertToByteArray(request, Encoding.UTF8);
DataWriter writer = new DataWriter(_client.OutputStream);
writer.WriteBytes(payload);
await writer.StoreAsync(); // <--- after this executes, it exits the method and continues
await writer.FlushAsync(); // <--- breakpoint never reaches here, instead
writer.DetachStream();
}
private void SomeOtherMethod()
{
string hello = "hello"; // <--- it skips everything and reaches here!
}
什么东西?
我认为您必须在Start函数中的初始SomeMethod调用之前放置wait:
await SomeMethod();
我认为Daniel Schlßer的回答可能还有其他问题。以下是我改进的方法:
private async void Start() {
await SomeMethod();
SomeOtherMethod();
}
异步函数一开始肯定应该用"wait"来调用。但是使用async函数的函数也应该被标记为"async"。
这就是我的观点。感谢
因为听起来您希望SomeMethod在调用SomeOtherMethod之前完成,所以您需要让它返回一个Task并等待该任务完成。您所需要做的就是将声明中的"async void"更改为"async Task",然后在Start方法中,将调用方更改为SomeMethod().Wait();
目前,由于您不等待任务的任何内容完成,因此一旦方法退出(命中第一个等待),就没有什么可以"阻止"它完成的任何其他内容。
使用"async void"意味着你不在乎它何时完成(如果完成,甚至可能是)。如果你真的很在意,你需要使用"async Task",然后适当地使用它。
不确定这是否有助于解释,但这是我写的一篇关于这个主题的博客文章:
http://blog.sublogic.com/2012/03/06/async-lesson-2-of-n-async-void-probably-isnt-what-you-want/
我认为您应该编辑:
StreamSocket _client;
private async Task Start() {
await SomeMethod();
SomeOtherMethod();
}
private async Task SomeMethod(string sample)
{
var request = new GetSampleRequestObject(sample);
byte[] payload = ConvertToByteArray(request, Encoding.UTF8);
DataWriter writer = new DataWriter(_client.OutputStream);
writer.WriteBytes(payload);
await writer.StoreAsync(); // <--- after this executes, it exits the method and continues
await writer.FlushAsync(); // <--- breakpoint never reaches here, instead
writer.DetachStream();
}
private void SomeOtherMethod()
{
string hello = "hello"; // <--- it skips everything and reaches here!
}
我希望能帮助你