本文讲述了 C# BeginInvoke回调函数!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
我有一个c#.NET winforms应用程序进行此异步调用:
simpleDelegate.BeginInvoke(null, null);
代理人正在调用我的函数,并且一切正常。问题是,在函数完成后,我需要主线程来更新我的winform上的一些控件。如果工作线程试图更新这些控件,.NET会吓坏。但我需要主线程保持对用户操作的响应,然后在工作线程完成调用异步函数后调用我的函数UpdateFormAfterServerCall()。
如果您能给我一个简洁的代码示例,而不是抽象地解释如何执行此操作,我将不胜感激。我已经阅读了一百个解释,我只是在正确连接它时遇到了麻烦。
注意:在BeginInvoke之前我有:
simpleDelegate = new MethodInvoker(CallServer);
答案 0 :(得分:3)
如果要更新另一个线程所拥有的GUI,请使用MethodInvoker
从不同的线程答案 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();
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!