1

我有一个正在线程池中执行的委托。计数作为变量正确传入,但是,当程序返回输出时,传入的初始值现在是更新版本。如何修改 ths 以使变量保持正确的值?

    private void SetControlText(TextBox TB, string txt)
    {
        if (TB.InvokeRequired)
        {
            Invoke((MethodInvoker)delegate
            {
                TB.AppendText(txt + "\n");
                TB.Update();
            });
            return;
        }

        TB.Text = txt;
    }

    private void DoWork(OCAdapter.OCAdapter Adapter, OutputForm output, int c, object ThreadContext = null)
    {
        int count = c;
        //output.AppendToOutput("Initializing Adapter: " + count + " Test\n");
        SetControlText(output.OutputBx, "Initializing Adapter: " + count + " Test\n");
        try
        {
            var Test = Adapter.GetBookmarks();
            if (Test != null)
                //output.AppendToOutput("Adapter: " + count + " is valid\n");
                SetControlText(output.OutputBx, "Adapter: " + count + " is valid\n");
        }
        catch (Exception ex)
        {
            //output.AppendToOutput("Exception occured on adapter: " + count + " Exception: " + ex.Message);
            SetControlText(output.OutputBx, "Exception occured on adapter: " + count + " Exception: " + ex.Message);
        }
    }
4

2 回答 2

1

嘿,我实际上找到了答案,线程正在使用共享内存,因此它们在变量递增后访问变量。

我解决这个问题的方法是传入一个带有计数的临时变量。

于 2013-05-24T01:29:23.657 回答
0

您的 SetControlText() 不太正确。它既在做 Invoke() ,又在设置 Text ,从错误的线程,直接在它下面;每次。

尝试这样的事情,看看问题是否消失:

    private delegate void SetControlTextDelegate(TextBox TB, string txt);
    private void SetControlText(TextBox TB, string txt)
    {
        if (TB.InvokeRequired)
        {
            TB.Invoke(new SetControlTextDelegate(SetControlText), new object[] { TB, txt });
        }
        else
        {
            TB.AppendText(txt + Environment.NewLine);
        }
    }
于 2013-05-08T02:16:25.730 回答