我有一个c#.NET winforms应用程序进行此异步调用:
simpleDelegate.BeginInvoke(null, null);
代理人正在调用我的函数,并且一切正常。问题是,在函数完成后,我需要主线程来更新我的winform上的一些控件。如果工作线程试图更新这些控件,.NET会吓坏。但我需要主线程保持对用户操作的响应,然后在工作线程完成调用异步函数后调用我的函数UpdateFormAfterServerCall()。
如果您能给我一个简洁的代码示例,而不是抽象地解释如何执行此操作,我将不胜感激。我已经阅读了一百个解释,我只是在正确连接它时遇到了麻烦。
注意:在BeginInvoke之前我有:
simpleDelegate = new MethodInvoker(CallServer);
答案 0 :(得分:3)
如果要更新另一个线程所拥有的GUI,请使用MethodInvoker
if(control.InvokeRequired)
control.Invoke( (MethodInvoker) ( ()=> updating_function() ) );
else
updating_function();
答案 1 :(得分:1)
Control
类(Form
也是Control
)具有Invoke
方法,您可以从任何线程调用此方法来执行GUI线程上的代码。
此外,Control
具有方便的InvokeRequired
属性,可以通知您是否已经在GUI线程上。例如,您可以在表单中创建以下方法:
public class MyForm
{
// ...
public void UpdateMe()
{
if (InvokeRequired)
{
Invoke(new Action(UpdateMe));
return;
}
// Code to update the control, guaranteed to be on the GUI thread
}
}
答案 2 :(得分:0)
您可以使用BackgroundWorker
:
BackgroundWorker bw = new BackgroundWorker();
string result = null;
bw.DoWork += (s, e) =>
{
// Executes on background thread.
// UI remains responsive to user activity during this time.
result = CallServer();
};
bw.RunWorkerCompleted += (s, e) =>
{
// Executes on UI thread upon completion.
resultTextBox.Text = result;
};
bw.RunWorkerAsync();
答案 3 :(得分:0)
以下是代码示例[您想要的确切] - http://www.yoda.arachsys.com/csharp/threads/winforms.shtml
&安培;你可以在这里阅读所有类型的异步 -
http://msdn.microsoft.com/en-us/library/2e08f6yc(v=vs.100).aspx