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!
}

什么东西?

await / async issues

我认为您必须在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!
}

我希望能帮助你