C#获取原始线程以设置文本框值

Luk*_*uke 1 c# multithreading thread-safety

我的主表单Form1运行了程序的主要部分.

我有一个单独的线程开始执行算法.

当我从新线程运行该方法时,方法MyAlgorithm()我得到错误

InvalidOperationException,消息"控制控件名称从其创建的线程以外的线程访问".

如何返回到原始线程,以便我可以运行该方法来更新具有最新值的文本框?

这是我想要运行的方法,包含在我的应用程序中的主类Form1中.

// Reset the results values
public void ShowResults()
{
    while (true)
    {

        loopsNum.Text = Convert.ToString(resultLoopsNum);
        nodesVisitedNum.Text = Convert.ToString(resultNodesVisitedNum);
        nodesResolvedNum.Text = Convert.ToString(resultNodesResolvedNum);
        cpuLoopsNum.Text = Convert.ToString(resultCpuLoopsNum);
        shortestPathCostNum.Text = Convert.ToString(resultShortestPathCost);

    } 
}
Run Code Online (Sandbox Code Playgroud)

我查看了Invoke()方法,但我不知道如何从thread方法获取Form1的原始实例.

我正在调用我的线程......

        // Set the algorithm method up in it's own thread
        Thread thread = new Thread(new ThreadStart(MyAlgorithm));

        // Run the algorithm
        thread.Start();
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

如何返回到原始线程,以便我可以运行该方法来更新具有最新值的文本框?

在Windows窗体中,您可以使用Control.Invoke/ 使用a 并在progress事件处理程序中执行更新.BeginInvoke BackgroundWorker

在WPF中你会使用Dispatcher.Invoke/ BeginInvoke.

在C#5和.NET 4.5中,您将能够使用异步方法,这将使这很简单...

我查看了Invoke()方法,但我不知道如何从thread方法获取Form1的原始实例.

如果"线程方法"只是一个实例方法Form,那么你已经得到了this引用.如果不是,您将需要提供该信息 - 理想情况下,ISynchronizeInvoke如果您可以单独表达"更新"部分,则避免直接依赖Windows窗体.(这个界面现在有点不赞成,有利于同步上下文,但它仍然可以很好地工作.)