Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C获取原始线程以设置文本框值_C#_Multithreading_Thread Safety - Fatal编程技术网

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

C# C获取原始线程以设置文本框值,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我已经让我的主窗体1运行我程序的主要部分 我有一个单独的线程开始执行一个算法 当我从新线程运行该方法时,我得到了错误 InvalidOperationException,消息为从创建控件的线程以外的线程访问的控件名 如何返回到原始线程,以便运行该方法以使用最新值更新文本框 这是我希望在Form1中运行的方法,Form1是我应用程序中的主类 // Reset the results values public void ShowResults() { while (true) {

我已经让我的主窗体1运行我程序的主要部分

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

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

InvalidOperationException,消息为从创建控件的线程以外的线程访问的控件名

如何返回到原始线程,以便运行该方法以使用最新值更新文本框

这是我希望在Form1中运行的方法,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);

    } 
}
我已经研究了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上显示的内容进行细粒度控制。

可能重复的可能重复感谢您的帮助,它现在可以工作了。但我不太明白为什么它必须是一个动作对象。调用什么时候不需要一个动作对象而不仅仅是一个函数名?这是因为这个方法可以用来调用任何方法,而不仅仅是具有给定签名的方法。看一看。另外,你会找到一个很好的解释。谢谢你的帮助,它正在工作。但我不太明白为什么它必须是一个动作对象。调用什么时候不需要一个动作对象而不仅仅是一个函数名?这是因为这个方法可以用来调用任何方法,而不仅仅是具有给定签名的方法。看看。另外,你会找到一个很好的解释。