BeginInvoke回调函数

时间:2012-06-08 13:43:11

标签: c# .net winforms multithreading .net-4.0

我有一个c#.NET winforms应用程序进行此异步调用:

simpleDelegate.BeginInvoke(null, null);

代理人正在调用我的函数,并且一切正常。问题是,在函数完成后,我需要主线程来更新我的winform上的一些控件。如果工作线程试图更新这些控件,.NET会吓坏。但我需要主线程保持对用户操作的响应,然后在工作线程完成调用异步函数后调用我的函数UpdateFormAfterServerCall()。

如果您能给我一个简洁的代码示例,而不是抽象地解释如何执行此操作,我将不胜感激。我已经阅读了一百个解释,我只是在正确连接它时遇到了麻烦。

注意:在BeginInvoke之前我有:

simpleDelegate = new MethodInvoker(CallServer);

4 个答案:

答案 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