0

例 :

try
{
    var myTask = Task.Run(async () =>
    {
        await Task.Delay(1);
    });

    myTask.ContinueWith(myContinuedTask =>
    {
        lock (myTask)
        {
            Task.Delay(1).Wait();
            Console.WriteLine(myContinuedTask.Id);
        }
    });
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}

1) myContinuedTask が myTask をロックするときは、(これを) ロックするようなものですよね?

2) インスタンスがこのコードの制御外で使用されている場合、これは良い考えではありません。

3) このインスタンスがこのコードの制御内でのみ使用される場合、myContinuedTask がロックを取得せず、待機状態のままになる可能性はありますか? タスクは TaskScheduler によって管理されることを知っています。そして、これがデッドロックにつながる可能性のあるタスクインスタンスをロックしているかどうかはわかりません?? (もっと情報が必要です)

4) タスクの Id フィールドは一意であるとは限りません。intなので、最大4^32個のタスクが存在できますよね?これは本当に低いようです。プロセスごと、スレッドごと、セッションごとなどですか?

ご協力ありがとうございました :)

4

1 に答える 1

0

1) myContinuedTask が myTask をロックするときは、(これを) ロックするようなものですよね?

いいえ; と同じlock(myContinuedTask)です。

2) インスタンスがこのコードの制御外で使用されている場合、これは良い考えではありませんよね?

正しい。可能な限り、常にプライベートまたはローカル スコープ変数をロックする必要があります。さらにobject、ロックとしてのみ使用するセパレートをお勧めします。

3) このインスタンスがこのコードの制御内でのみ使用される場合、myContinuedTask がロックを取得せず、待機状態のままになる可能性はありますか? タスクは TaskScheduler によって管理されることを知っています。そして、これがデッドロックにつながる可能性のあるタスクインスタンスをロックしているかどうかはわかりません?? (もっと情報が必要です)

もちろん、それは可能です。ロックに使用するオブジェクト インスタンスを公開するとすぐに、デッドロックが発生する可能性があります。

4) タスクの Id フィールドは一意であるとは限りません。intなので、最大4^32個のタスクが存在できますよね?これは本当に低いようです。プロセスごと、スレッドごと、セッションごとなどですか?

彼らはただ複製を始めます、それだけです。心配ない。


コードに関するその他の問題は次のとおりです。

  • ContinueWithの代わりに使用しawaitます。
  • Task.Delay(..).Wait()の代わりに使用しThread.Sleepます。

また、これは非同期コードであるため、SemaphoreSlim代わりにlock.

于 2016-05-02T01:25:38.177 に答える