我试图使用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));
}
答案 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
}));