Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# 为什么只有在线程访问UI控件时,才会在调试中发生异常?_C#_Multithreading_Threadpool - Fatal编程技术网

C# 为什么只有在线程访问UI控件时,才会在调试中发生异常?

C# 为什么只有在线程访问UI控件时,才会在调试中发生异常?,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我只是对线程和UI控件很好奇 根据我的测试代码,当我运行compliated.exe文件时,线程访问processbar没有任何问题。但是当我调试代码时,出现了一个InvalidOperationException。(无论池线程还是普通线程。) 因此,我知道线程不允许访问UI控件,但为什么在运行.exe文件时它是正常的。这是一个预定的设计吗 另外,我知道我们可以使用backgroundworker使事情变得优雅 private void button1_Click(object sender,

我只是对线程和UI控件很好奇

根据我的测试代码,当我运行compliated.exe文件时,线程访问processbar没有任何问题。但是当我调试代码时,出现了一个InvalidOperationException。(无论池线程还是普通线程。)

因此,我知道线程不允许访问UI控件,但为什么在运行.exe文件时它是正常的。这是一个预定的设计吗

另外,我知道我们可以使用backgroundworker使事情变得优雅

private void button1_Click(object sender, EventArgs e)
{
    Task.Factory.StartNew(dothing);//use the pooled thread
    //Thread t = new Thread(new ThreadStart(this.ThreadProcSafe));
    //t.Start();
}

private void dothing()
{
    for (int i = 1; i <= 100; i++)
    {
        progressBar2.Value = i;
        Thread.Sleep(100);
    }
}
private void按钮1\u单击(对象发送者,事件参数e)
{
Task.Factory.StartNew(dothing);//使用池线程
//线程t=新线程(新线程开始(this.ThreadProcSafe));
//t、 Start();
}
私人空间点滴()
{

对于(inti=1;i在我的内存中,你不能在其他线程中访问UI元素,只能在主线程中访问。这是因为一些多线程问题(同一内存中的多访问、异步问题等等)。
如果你想做你想做的事,你可以使用“委托函数”在C#

中,我想你刚刚告诉了他他所说的他已经知道了我知道我们有一些访问UI的方法。但我的问题是,为什么我毫无例外地运行exe文件是可以的。运行示例时,它应该
而不是
在运行时工作。它工作,对吗?因为你的程序不够复杂。其他原因是Processbar是一个简单的UI元素。如果你使用Viewtable之类的包含读/写的东西,你的线程/系统线程/主线程都会与之交互。你的程序很快就会崩溃。在你调试时,很可能是另一个线程导致了异常。我并不假装知道调试器在较低级别上是如何工作的。但它可以ld将产生一个额外的线程,这将导致比赛状态。+1个好问题,很容易重新设置。类似的问题:@Jeremythonpson我想说这基本上回答了这个问题:)调试带有断点的UI行为通常很棘手,因为当您有断点时,顶部窗口将成为visual studio,然后当您返回UI时,将调用更新/刷新方法,但如果您未调试,则不会触发该事件。最好使用任何类型的文件日志来检测发生了什么