2

GetFilesを呼び出す2番目のスレッドを作成し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);
}
4

2 に答える 2

3

メインスレッドから呼び出しているため、メインスレッドがハングGetFiles()しました。デッドロックがあるので、シナリオは次のとおりです。

メイン スレッドは、シグナルが進行するのを待っている行でブロックされますが、シグナルはメイン スレッド " " でコードを実行することに依存しており、最後のスレッドは終了を待ってブロックさautoEvent.WaitOne();れるため、そのシグナルを受信することはありません。デッドロック。listBox1.Items.Add(number);autoEvent.WaitOne()

GetFiles()メインスレッドではなく別のスレッドからメソッドを実行することを修正するには、次のようにします。

ThreadPool.QueueUserWorkItem(new WaitCallback((_) => { GetFiles(); }), null);
于 2011-07-16T03:01:30.070 に答える
1

おそらく、メインスレッドでイベントと同期していて、呼び出しを処理できないだけです。

イベントを使用するコードは、後でGetFilesメソッドに投稿する必要があります。

于 2011-07-15T15:53:30.440 に答える