使用调度程序的PushFrame时执行同步调用

时间:2017-10-23 13:47:42

标签: c# wpf multithreading synchronization dispatcher

我正在开发.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,只能自己调用​​它。

1 个答案:

答案 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);
}

我希望这会有所帮助。