C# C获取原始线程以设置文本框值
我已经让我的主窗体1运行我程序的主要部分 我有一个单独的线程开始执行一个算法 当我从新线程运行该方法时,我得到了错误 InvalidOperationException,消息为从创建控件的线程以外的线程访问的控件名 如何返回到原始线程,以便运行该方法以使用最新值更新文本框 这是我希望在Form1中运行的方法,Form1是我应用程序中的主类C# C获取原始线程以设置文本框值,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我已经让我的主窗体1运行我程序的主要部分 我有一个单独的线程开始执行一个算法 当我从新线程运行该方法时,我得到了错误 InvalidOperationException,消息为从创建控件的线程以外的线程访问的控件名 如何返回到原始线程,以便运行该方法以使用最新值更新文本框 这是我希望在Form1中运行的方法,Form1是我应用程序中的主类 // Reset the results values public void ShowResults() { while (true) {
// 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);
}
}
我已经研究了Invoke方法,但是我不知道如何从线程方法中获取Form1的原始实例
我正在像这样调用我的线程
// Set the algorithm method up in it's own thread
Thread thread = new Thread(new ThreadStart(MyAlgorithm));
// Run the algorithm
thread.Start();
您可以使用:
myform.Invoke(ShowResults);
您可以使用:
myform.Invoke(ShowResults);
如何返回到原始线程,以便运行该方法以使用最新值更新文本框
在Windows窗体中,您可以使用/或使用BackgroundWorker并在进度事件处理程序中执行更新
在WPF中,您将使用/
在C5和.NET4.5中,您将能够使用异步方法,这将使这方面的工作更加简单
我已经研究了Invoke方法,但是我不知道如何从线程方法中获取Form1的原始实例
如果线程方法只是表单的一个实例方法,那么您已经得到了this引用。如果不是,那么您需要提供这些信息——如果您可以单独表达更新部分,最好是作为一个示例,以避免对Windows窗体的直接依赖。这种接口现在有些不受欢迎,支持同步上下文,但它仍然工作得很好
如何返回到原始线程,以便运行该方法以使用最新值更新文本框
在Windows窗体中,您可以使用/或使用BackgroundWorker并在进度事件处理程序中执行更新
在WPF中,您将使用/
在C5和.NET4.5中,您将能够使用异步方法,这将使这方面的工作更加简单
我已经研究了Invoke方法,但是我不知道如何从线程方法中获取Form1的原始实例
如果线程方法只是表单的一个实例方法,那么您已经得到了this引用。如果不是,那么您需要提供这些信息——如果您可以单独表达更新部分,最好是作为一个示例,以避免对Windows窗体的直接依赖。现在,该接口有点不受欢迎,支持同步上下文,但它仍然工作得很好。请看一下:
看看:
这里还有其他选择: 或者使用System.Forms.Timer定期调用ShowResults。或者另一种选择是不使用另一个线程来执行操作;在GUI线程中执行此操作,并在希望GUI更新时从操作中调用Application.DoEvents
第一个选项很好,因为它可以防止您意外地用调用请求淹没GUI;第二个选项很好,因为它都在GUI线程上,允许您对GUI上显示的内容进行精细控制。这里还有其他选项: 或者使用System.Forms.Timer定期调用ShowResults。或者另一种选择是不使用另一个线程来执行操作;在GUI线程中执行此操作,并在希望GUI更新时从操作中调用Application.DoEvents
第一个选项很好,因为它可以防止您意外地用调用请求淹没GUI;第二个选项很好,因为它都在GUI线程上,允许您对GUI上显示的内容进行细粒度控制。可能重复的可能重复感谢您的帮助,它现在可以工作了。但我不太明白为什么它必须是一个动作对象。调用什么时候不需要一个动作对象而不仅仅是一个函数名?这是因为这个方法可以用来调用任何方法,而不仅仅是具有给定签名的方法。看一看。另外,你会找到一个很好的解释。谢谢你的帮助,它正在工作。但我不太明白为什么它必须是一个动作对象。调用什么时候不需要一个动作对象而不仅仅是一个函数名?这是因为这个方法可以用来调用任何方法,而不仅仅是具有给定签名的方法。看看。另外,你会找到一个很好的解释。