【发布时间】:2017-10-23 13:47:41
【问题描述】:
我正在为 .Net WPF 应用程序开发一个插件,它使用帧推送技术来实现“负责任的”用户界面。其 SDK 中的每个长时间运行的任务都会调用代码:
public static void Wait(Task task)
{
DispatcherFrame nestedFrame = new DispatcherFrame();
task.ContinueWith(delegate { return nestedFrame.Continue = false; });
Dispatcher.PushFrame(nestedFrame);
task.Wait();
}
所以典型的SDK的方法可以用下面的代码来模拟:
private void SdkMethod()
{
var t = Task.Factory.StartNew(() =>
{
Thread.Sleep(1500);
});
Wait(t);
}
这会导致我无法从 UI 线程对 SDK 的方法进行两次同步调用:
private void OnClick(object sender, RoutedEventArgs e)
{
this.sdk.SdkMethod();
this.sdk.SdkMethod();
}
在这种情况下有什么方法可以同步调用吗?我无法修改 SDK,只能自己调用它。
【问题讨论】:
-
@MickyD,这是一个基于 .Net 4.0 的遗留系统,我无法更改 SDK 中的内容。我知道可以通过适当的 async/await 和完全同步 SDK 调用轻松实现,但我的能力有限。
-
@MickyD,感谢您的回复。但是对于这种特殊情况,我需要同步调用,而不是异步调用。我在我的插件中经常使用异步/等待和任务,问题不在于它们。
-
@MickyD
SdkMethod无法控制 OP,他无法更改。 -
@MickyD、SdkMethod 和 Wait 不是我的,我发布它们是为了演示 SDK 内部的内容以及不让我的调用同步的内容。
-
“这会导致我无法进行两次同步调用” - 为什么,会发生什么,出了什么问题?
标签: c# wpf multithreading synchronization dispatcher