1

関数を呼び出すC#プログラムを作成しました。このプログラムをbackgndWorkerEnroll_DoWork介して、スレッドを介して別の関数を呼び出します。初めてスレッドを開始した後、関数は正しく機能します。次に、メソッドを使用してスレッドを中止し、メソッドを再度thread.Abort()呼び出します。thread.Start()前の関数呼び出しは引き続き機能し、中止されません。どうすればスレッドを強制的にシャットダウンできますか?

public int capture()
{
    System.Threading.Thread thEnroll = new System.Threading.Thread(delegate()
    {
        // winbio.OpenSession1();
        refresult1 = winbio.Enroll1(finger, false, refresult);
        //winbio.Enroll1(finger, false, refresult, out refresult1);
    });

    thEnroll.Name = "thEnroll";
    thEnroll.Start();
    while (true)
    {
        if (!thEnroll.IsAlive)
            break;
    }
    thEnroll.Abort();
    return result;
}

private void backgndWorkerEnroll_DoWork(object sender, DoWorkEventArgs e)
{
    capture();
}

また、ボタンクリックイベントを介してbackgroundDo_Workを強制的に閉じるためのもう1つのquery.howもあります。

4

2 に答える 2

3

無限ループがあるため、中止アクションに到達しないようです。

while (true)
{
    // This will run forever
    if (!thEnroll.IsAlive)
        break;
}

このループは、スレッドの終了をブロックします。
また、あなたの移植は奇妙に見えます、スレッドが生きていなければ、あなたはそれを中止する必要はありません。

于 2013-03-18T12:15:15.907 に答える
0

私はあまり詳しくないmultithreadingので、間違っている場合は訂正してください...しかし、私が理解しThreadていることから、aが中止されると、それを再開することはできません。これはあなたが経験している振る舞いを説明するかもしれません(最初はうまくいきますが、最初にthread停止した後はうまくいきません)

私はとの違いをグーグルで検索しましたthread.abortthread.joinこれを参照

代わりに呼び出す場合Thread.Join、スレッドは、サイトが言っていることexitをスローする代わりにうまく機能します。呼び出した後は、を呼び出すか、それを処理する必要があります。ThreadAbortedExceptionabortjoinThreadAbortedException

于 2013-03-18T12:35:24.633 に答える