我遇到了WinRT项目的问题。目前程序上的执行是在两个线程上运行的。一个线程执行主应用程序,另一个线程处理事物的UI方面。目前,我有一个问题,从主线程调用一个函数在UI线程上执行,等待一个回复,然后在主线程上继续执行......让我向您展示一些代码作为示例。WinRT跨线程同步异步调用
public async void SignOut(Action onSuccess, Action onFailure)
{
bool success = false;
bool wait = true;
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
{
await SignOutAsync();
success = true;
wait = false;
});
while (wait) { }
if (success)
{
onSuccess();
}
else
{
onFailure();
}
}
所以这段代码是做什么的我想要它做的,但它显然不是去了解它与忙等待和所有的正道。问题是,如果我将OnSuccess/OnFailure执行移入RunAsync lambda,那么关于无效内存的回调会出现错误,因为执行在不同的线程上。目前我面临的问题是,我无法在不影响执行顺序的情况下排除繁忙的等待。理想情况下,我想等待整个RunAsync lambda在UI线程上完成执行,然后返回到主线程以运行成功/失败回调。
当我点击RunAsync lambda的await SignOutAsync()部分时,RunAsync任务将其自身标记为完整,并在SignOutAsync方法有任何结果之前返回成功/失败检查。我相信这是由于嵌套的异步方法,你不能真正等待RunAsync调用,然后再次在其中的异步lambda。
任何意见将不胜感激。