7

スレッドがその中func1の別の関数を呼び出す関数を実行してfunc2いる場合...

次に、thread.Abort()を呼び出しました。

これはOR func1のみを停止し、すべての関数が呼び出されますか?
func1func2func1

ありがとう

編集:ここに詳細があります:

func1新しいスレッドで呼び出さfunc2れ、定期的に継続的に呼び出されます...
func2一部の配列がnullでない場合にのみ、一部の作業を開始します。終了して戻ります。

スーパーバイザーがデータを保存したい場合、-のスレッドを中止してからfunc1配列をnullにし、データを保存してから、配列に新しいものを入力します。そして、スレッドをfunc1再開します。

配列がnullであるために例外が発生することがありますfunc2。したがって、func1の中止はfunc2に影響しませんでした。

4

4 に答える 4

14

Thread.Abortスレッドを停止することは保証されていないため、可能であれば使用を避ける必要があります。

このメソッドを呼び出すと、通常、スレッドが終了します。

強調鉱山。

ThreadAbortExceptionそれがすることは、ターゲットスレッドでを上げることです。この例外をキャッチすると、catchブロックの最後に到達するまでコードの実行が続行され、その時点で例外が自動的に再スローされます。キャッチしない場合は、通常の例外と同様です。つまり、コールスタックに伝播します。

例外をキャッチしないと仮定すると、そのスレッドで実行されているすべてのコードは実行を停止します。そのスレッドから開始された他のスレッドは影響を受けません。

于 2010-05-24T20:21:55.577 に答える
3

そのスレッド内で開始されたものはすべて中止されます。

于 2010-05-24T20:15:50.070 に答える
0

ThreadAbortExceptionがfunc1スレッドに到達する前に、func2がnull配列をチェックした後、メインルーチンが配列をnullにする競合状態に直面している可能性があります。

少なくとも、メインコードとfunc2は配列の周りにロックを使用する必要があります。また、func1スレッドが停止していることをテストしてから、再度再起動する必要があります。そして、他の誰もが言っているように、Thread.Abortに依存するのではなく、スレッドに停止するように通知します。

func2がfunc1スレッド内から呼び出されることは、あなたの説明から100%わかりませんが、func2がfunc1内から開始された別のスレッドで実行されている場合、すべてのスレッドが子として存在するため、func1スレッドを削除してもfunc2には影響しません。親プロセスの、それらが開始されたスレッドのではありません。

于 2010-05-24T21:36:15.137 に答える
0

気になる人のために:さらに
デバッグした 後、スレッドが開始前にもう一度初期化されていることがわかりました。スレッドをバックグラウンドで実行させます...

    Thread T
    T=new Thread(func1);
    // Some code...
    // Start:
    T=new Thread(func1);

バックグラウンドでこの参照されていないものはAbort()の影響を受けません...したがって、動作を継続し、null配列を使用しようとします...

最後に:
Abort()は、いくつかの条件(上記の他の回答で述べた)を除いて、スレッドを終了します
(明らかに)Abort()は、参照されていない後にスレッドを終了しません

ありがとう!!

于 2010-05-24T21:46:14.350 に答える