绑定的数据源在非UI线程中更新

时间:2018-01-12 20:23:38

标签: c# winforms datagridview

我试图使用Grpc,在其示例中用于双向流使用此示例:

using (var call = client.RouteChat())
{
    var responseReaderTask = Task.Run(async () =>
    {
        while (await call.ResponseStream.MoveNext())
        {
            //
            // What if I want to update a list bound to a UI 
            // control here?
            //
        }
    });

    foreach (RouteNote request in requests)
    {
        await call.RequestStream.WriteAsync(request);
    }
    await call.RequestStream.CompleteAsync();
    await responseReaderTask;
}

问题是我想要添加到responseReaderTask中的列表。该列表绑定到dataGridView,因此抛出了一个跨线程异常。我看过一些例子,说我应该改变NotifyPropertyChanged来使用Invoke?但我目前的方法已经做到了。

private void NotifyPropertyChanged(String info)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
}

1 个答案:

答案 0 :(得分:0)

您要引用的示例希望您专门调用UI线程。这与委托的调用调用不同。

你的问题标签是WinForms,但我很确定你正在寻找一个WPF的例子。

WPF:

        while (await call.ResponseStream.MoveNext())
        {
            //
            // Use the dispatcher to invoke below onto the UI thread.
            this._someUiControl.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
            {
                // Do UI stuff inside this scope 
            }));
        }

WinForms类似:

            // Use a UI control to BeginInvoke onto the UI thread.
            this._someUiControl.BeginInvoke(new Action(() =>
            {
                // Do UI stuff inside this scope 
            }));