繁体   English   中英

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

[英]Doing synchronous calls when dispatcher's PushFrame is used

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

如果我从阅读帖子和评论中正确理解,则希望调用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);
}

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM