C# 异步文本框中的内容

C# 异步文本框中的内容,c#,C#,我想在文本框中异步显示内容?有人知道我下面列出的代码的错误吗?我想实现文本框中的文本每秒将更新新值?我还想问为什么每次调用控制器的invoke方法之前都要检查invokererequired private void Counting(int Num) { int i = 0; string counter = null; while (i < Num) { Thread.Sl

我想在文本框中异步显示内容?有人知道我下面列出的代码的错误吗?我想实现文本框中的文本每秒将更新新值?我还想问为什么每次调用控制器的invoke方法之前都要检查invokererequired

        private void Counting(int Num)
    {

        int i = 0;
        string counter = null;
        while (i < Num)
        {
            Thread.Sleep(1000);
            counter = string.Format(" {0}", i);
            tbxStatus.BeginInvoke(new UpdateStatusDelegate(UpdateStatus), new string[] { counter });
        }

    }

    public void UpdateStatus(string data)
    { 
        tbxStatus.Text += data;
    }

    public delegate void UpdateStatusDelegate(string data);

    public delegate void CountDelegate(int num);

    private void btnStart_Click(object sender, EventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new CountDelegate(Counting), new object[] { 5 });
        }
        else
            Counting(5);
    }
private void Counting(int Num)
{
int i=0;
字符串计数器=null;
while(i

谢谢

您的
调用所需的
测试应该在代理中:

public void UpdateStatus(string data)
{
    if (this.tbxStatus.InvokeRequired)
    {
        UpdateStatusDelegate d = new UpdateStatusDelegate(UpdateStatus);
        this.Invoke(d, new object[] { data });
    }
    else
    {
        this.tbxStatus.Text = data;
    }
}
如果使用以下扩展方法,还可以使其更简单、更清晰:

public static TResult SafeInvoke(this T isi, Func call) where T : ISynchronizeInvoke
{
    if (isi.InvokeRequired) {
        IAsyncResult result = isi.BeginInvoke(call, new object[] { isi });
        object endResult = isi.EndInvoke(result); return (TResult)endResult;
    }
    else
        return call(isi);
}

public static void SafeInvoke(this T isi, Action call) where T : ISynchronizeInvoke
{
    if (isi.InvokeRequired) isi.BeginInvoke(call, new object[] { isi });
    else
        call(isi);
}
因此,如果我想调用我在UI线程中定义的方法(如表单实例中定义的方法),您可以使用以下代码(无需创建任何委托或其他内容):

在您的情况下,您可以执行以下操作:

formInstance.SafeInvoke(f => f.UpdateStatus(myCounterInt.toString));
或者类似的


我已经写过关于使用此功能的文章,但不要像我写的那样给我荣誉,因为我最近遇到了类似的问题

我正在编写一个网络游戏,我想将文本附加到我拥有的文本框中,但是我会得到一个错误,说我试图从另一个线程更改windows窗体控件,从而导致线程不安全。这是因为我在服务器端使用ASyncCallback

我以前有过这样的例子:(console方法是一个简单的方法,它获取一个字符串并将其附加到textbox)

为了解决这个问题,我不得不把它改成现在解决这个问题:

    this.Invoke((MethodInvoker)delegate { console("message"); });
希望这能帮助其他遇到这个问题的人。这可能不是最好的办法,但对我来说确实是个好办法

问候

    console("message");
    this.Invoke((MethodInvoker)delegate { console("message"); });