c# - 从多个线程更新 DataGrid

标签 c# wpf multithreading datagrid timeout

我想从 WPF(c#) 中的多线程更新我的 DataGrid。我使用 dataGrid.Dispatcher.BeginInvoke() 和 dataGrid.Dispatcher.Invoke() 但它们卡住了程序(主线程)。如何在超时的情况下从多个线程更新 dataGrid(因为我使用的 Web 服务可能无法访问)。

最佳答案

使用 Task 异步启动 Web 服务请求。为此,您可能需要将 EAP(基于事件的异步模式)样式转换为 TAP(基于任务的异步模式)样式。以下是您的操作方法。

private Task<IEnumerable<YourDataItem>> CallWebServiceAsync()
{
  var tcs = new TaskCompletionSource();
  var service = new YourServiceClient();
  service.SomeOperationCompleted +=
    (sender, args) =>
    {
      if (args.Error == null)
      {
        tcs.SetResult(args.Result);
      }
      else
      {
        tcs.SetException(args.Error);
      }
    };
  service.SomeOperationAsync();
  return tcs.Task;
}

完成后,您就可以使用新的 asyncawait 关键字进行调用并使用延续样式语义等待它返回。它看起来像这样。

private async void Page_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
  IEnumerable<YourDataItem> data = await CallWebServiceAsync();
  YourDataGrid.DataSource = data;
}

就是这样!没有比这更优雅的了。这将在后台线程上异步执行操作,然后将结果绑定(bind)到 UI 线程上的 DataGrid

如果 WCF 服务不可访问,那么它将抛出异常并将附加到 Task,以便它传播到 await 调用。届时它将被注入(inject)到执行中,并在必要时用 try-catch 进行包装。

关于c# - 从多个线程更新 DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19723314/

相关文章:

iphone - iOS - 线程不会回到主线程

c# - 告诉 ConfigurationManager 忽略 App.config 部分

c# - 可折叠的主细节 GridView 结构

wpf - 如何选择 WPF 的图标作为应用程序的图标?

c# - 如果用户单击不可聚焦的内容,如何使控件失去焦点?

java - 确定哪些 Callables 当前正在 ExecutorService 中运行

java - 生产者消费者 - ExecutorService & ArrayBlockingQueue

c# - 如何根据当前主题更改 MahApps.Metro 进度条颜色?

c# - 从 C# 调用 c 函数

c# - WPF MVVM 后台打印数据绑定(bind)问题