我正在开发.Net WPF应用程序的插件,该应用程序使用框架推送技术来实现“负责任”的UI。 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,只能自己调用它。
答案 0 :(得分:0)
如果我通过阅读帖子和评论正确理解,你想要调用SdkMethod并让它同步行动。它被召唤而不会让你知道它何时完成。
如果它是一种无效的方法并且它不是一项任务,那么你就不会得到任何回报。我试着听Dispatcher Hooks完成,但那没用。
我创建了一个具有Task.Delay的aysnc Task方法,然后在调用之间等待它。这样你就不会打断用户,但是在你调用第二种方法之前,你仍然会强制暂停通话。
private void OnClick(object sender, RoutedEventArgs e)
{
this.sdk.SdkMethod();
await DelayAsync(3).ConfigureAwait(false);
this.sdk.SdkMethod();
}
private async Task DelayAsync(int seconds)
{
await Task.Delay(seconds * 1000).ConfigureAwait(false);
}
我希望这会有所帮助。