3

我正在使用 Windows 8 CP 并发现在我的应用程序中,我无法正确地使新的 async/await 机制正常工作。

我向您展示的这种方法在作为 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!
}

是什么赋予了?

4

4 回答 4

6

我认为您必须在 Start 函数中的初始 SomeMethod 调用之前放置 await :

await SomeMethod();

于 2012-03-14T15:35:00.007 回答
2

我认为 Daniel Schlößer 的回答可能还有其他问题。这是我改进的方法:

private async void Start() {
    await SomeMethod();
    SomeOtherMethod();
}

一个异步函数应该在开始时使用“await”来调用。但是使用异步函数的函数也应该被签名为“异步”。

这就是我的观点。谢谢

于 2012-09-26T03:23:56.480 回答
1

由于听起来您希望 SomeMethod 在调用 SomeOtherMethod 之前完成,因此您需要让它返回一个 Task 并等待该任务完成。您需要做的就是将声明中的“async void”更改为“async Task”,然后在 Start 方法中,将调用者更改为 SomeMethod().Wait();

就目前而言,由于您没有等待任务完成任何事情,因此一旦方法退出(点击第一个等待),就没有什么可以“阻止”它完成的其他任何事情。

使用“async void”意味着你不在乎它何时完成(或者即使完成了)。如果您确实关心,则需要使用“异步任务”,然后适当地使用它。

不确定它是否有助于解释,但这是我就该主题所做的博客文章:

http://blog.sublogic.com/2012/03/06/async-lesson-2-of-n-async-void-probably-isnt-what-you-want/

于 2012-03-15T05:17:33.920 回答
0

我认为你应该编辑:

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

希望对你有帮助

于 2013-08-23T07:11:25.293 回答