繁体   English   中英

C# 主线程被第二个线程阻塞使用信号?

[英]C# main thread is blocked by second thread using signaling?

GetFiles创建调用CopyFiles的第二个线程,我只是试图在每次复制文件时用文件名填充列表框,但是一旦代码命中行:

listBox1.Invoke((MethodInvoker)delegate { PrintProgress(i.ToString()); }, new object[] { }); 

主线程被阻塞,有什么想法吗?

void GetFiles()
{
    AutoResetEvent autoEvent = new AutoResetEvent(false);
    ThreadPool.QueueUserWorkItem(new WaitCallback(CopyFiles),autoEvent);

    //some unrelated code

    autoEvent.WaitOne();
}

private void CopyFiles(object stateInfo)
{
    for (int i = 0; i < 10; i++)
    {
        //SetControlPropertyValue(listBox1, i.ToString());       
        listBox1.Invoke((MethodInvoker)delegate { PrintProgress(i.ToString()); }, new object[] { });
        Thread.Sleep(1000);
    }

    // Signal that this thread is finished.
    ((AutoResetEvent)stateInfo).Set();     
}

private void PrintProgress(string number)
{
    listBox1.Items.Add(number);
}

您的主线程挂起,因为您正在从中调用GetFiles() 所以你有一个死锁,这是一个场景:

主线程将阻塞在autoEvent.WaitOne(); 等待信号继续,但它永远不会收到该信号,因为信号取决于在主线程“ listBox1.Items.Add(number); ”上执行代码,最后一个将阻塞等待autoEvent.WaitOne()完成。 死锁。

为了解决这个问题,从另一个线程而不是主线程运行GetFiles()方法,所以:

ThreadPool.QueueUserWorkItem(new WaitCallback((_) => { GetFiles(); }), null);

可能您正在与主线程上的事件同步,它只是无法处理调用。

您应该稍后在 GetFiles 方法中发布使用该事件的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM