开发者

C# main thread is blocked by second thread using signaling?

GetFiles creates the second thread which calls CopyFiles, I am just trying to fill the listbox with the file name each time a file is copied, but once code hits line:

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

main thread gets blocked, any ideas?

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 n开发者_JAVA技巧umber)
{
    listBox1.Items.Add(number);
}


Your main thread hanged because you are calling the GetFiles() from it. so you have a dead lock, here is a scenario:

The main thread will block at line autoEvent.WaitOne(); waiting for a signal to proceed, but it will never receive that signal because the signal is depending on executing a code on the main thread "listBox1.Items.Add(number);" and the last one will blocked waiting for autoEvent.WaitOne() to finish. a dead lock.

To fix that run the GetFiles() method from another thread rather than the main thread, so:

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


Probably you are synchronizing with the event on main thread, and it just can't process the invokes.

You should post the code that uses the event later in GetFiles method.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜