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)
如何返回到原始线程,以便我可以运行该方法来更新具有最新值的文本框?
在Windows窗体中,您可以使用Control.Invoke/ 或使用a 并在progress事件处理程序中执行更新.BeginInvoke BackgroundWorker
在WPF中你会使用Dispatcher.Invoke/ BeginInvoke.
在C#5和.NET 4.5中,您将能够使用异步方法,这将使这很简单...
我查看了Invoke()方法,但我不知道如何从thread方法获取Form1的原始实例.
如果"线程方法"只是一个实例方法Form,那么你已经得到了this引用.如果不是,您将需要提供该信息 - 理想情况下,ISynchronizeInvoke如果您可以单独表达"更新"部分,则避免直接依赖Windows窗体.(这个界面现在有点不赞成,有利于同步上下文,但它仍然可以很好地工作.)