【发布时间】:2019-06-21 17:59:20
【问题描述】:
我正在构建一个 UWP 应用程序,它显然包含几个对异步方法的等待调用。
在其中一个事件处理程序中,我需要确保调用链在单个线程中执行。
我试图通过等待并获得结果来制作我需要的异步方法的“同步”版本,如下所示:
public static T Sync<T>(this Task<T> task)
{
if (task == null)
return default(T);
return task.ConfigureAwait(false).GetAwaiter().GetResult();
}
甚至更残酷:
public static T Sync<T>(this Task<T> task)
{
if (task == null)
return default(T);
task.Wait();
return task.Result;
}
但我遇到了其他几个博客中描述的死锁问题,因为我在 UI 线程上运行。
有没有办法实现我的目标?
【问题讨论】:
-
如果异步调用使用
.ConfigureAwait(false),您无能为力。如果他们不这样做,他们的延续将在 UI 线程上运行,所以你已经在一个线程上 -
我不害怕继续,我想在 UI 线程中,我想避免在等待时,另一个异步调用会改变我的状态。基本上我想将我的完整调用链包装成一个单线程操作。
-
异步代码将使用 SynchronizationContext.Current 属性,因此您可以创建一个自定义类来处理线程中的 Post/Send 方法,但据我所知 UWP 框架已经有一个自定义在(单个)UI 线程中运行所有异步代码的上下文,所以我不明白你的问题? docs.microsoft.com/en-us/dotnet/api/…
标签: c# multithreading uwp async-await deadlock