【问题标题】:Method not exiting with await/async (UWP + Rpi3)方法不退出等待/异步(UWP + Rpi3)
【发布时间】:2016-11-03 11:49:17
【问题描述】:

我刚开始使用我的新 Raspberry Pi 3 和 Win10 IOT。

我尝试了一个小项目,但在 async/await 语句方面遇到了一些问题。

我不是 C# 新手,也不是 await/async 新手,但这是我第一次使用 UWP,所以我可能会错过这个平台与 WinForms/WPF 环境相比的一些技巧。

(仅供参考,我暂时没有接触到Win10开发机,所以下面的sn-ps可能无法立即编译)


这是 Rpi 上无头应用程序的标准模板:

public async void Run(IBackgroundTaskInstance taskInstance)
{
    taskInstance.GetDeferral();

    await DoSomethingAsync();

    // Other irrevelant stuff then...

    defferal.Complete();
}

然后是异步方法:

private async Task DoSomethingAsync()
{
    // Something done async
    await Task.Delay(1000);
} // <--- Hangs here

将应用部署到树莓派时,进入DoSomethingAsync方法,执行其内容没有问题。

我的问题是应用程序在退出的分号处挂起。

我们需要使用CoreDispatcherThreadPool,还是简单的new TaskFactory().StartNew(async () =&gt; { await DoSomethingAsync(); });

我不明白的是,使用 await/async 应该在另一个线程上执行我的方法,但它挂起的方式与等待 UI 处理消息队列的方式相同(此处为 WinForms/WPF 背景: ) )

提前谢谢你。

编辑:如果我删除所有异步内容以使其同步运行,则此 sn-p 有效。

【问题讨论】:

  • 你是什么意思“挂起”和什么退出分号?顺便说一句,您不需要提供任何额外的东西。在任何情况下,await 等待异步方法的完成,它不会自动使某些东西异步
  • What I don't understand is the use of the await/async should execute my method on an other thread 如果您需要在另一个线程上完成工作,则不应使用awaitawait 将等待通话结束。
  • @PanagiotisKanavos,我编辑了我的问题,并评论了它挂在哪个右括号上。我所说的挂起是指当我一步一步地做一些事情时,它不会走得更远。
  • @jackjop await 将等待调用完成,但由于方法是async,因此执行与“主线程”异步运行,因此不应阻塞任何它。
  • 这在 Windows 10 Destktop 上似乎不是问题。

标签: c# async-await uwp iot raspberry-pi3


【解决方案1】:

我在你的代码中没有看到 Complete() 方法延迟,试试这个:

public async void Run(IBackgroundTaskInstance taskInstance)
{
    BackgroudTaskDefferal defferal = taskInstance.GetDeferral();

    await DoSomethingAsync();

    // Other irrevelant stuff then...

    defferal.Complete();
}

这可能是挂起的问题,应用程序正在等待异步操作完成的信号。

【讨论】:

  • 我编辑了我的问题,我没有包含 defferal.Complete(); 因为它在此之前挂起。
  • 有趣,现在看起来不错,我的应用程序中的代码几乎相同。您是否收到一些错误或它只是“冻结”?你的异步代码中的东西不是很持久吗?
  • 没有错误(但我没有等待超过 10 秒)。这是一个 UWP,所以我今晚会在 PC 上试用它,而不是部署在 Rpi 上。真正的异步代码只会将DateTime.Now.ToString() 写入文件。
【解决方案2】:

如果删除所有断点,请添加调试日志,如

`System.Diagnostics.Debug.WriteLine`

调试消息将显示一切正常。

只有在使用 VS 进行远程调试时才会发生挂起。

我建议你打开一个用户语音请求。

【讨论】:

  • 对,我还没有尝试不附加断点/调试器。我试试这个。
  • 我没有时间测试它(更像是一个业余爱好项目而不是一个专业项目:))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多