11

私は現在、タスク、非同期、および Windows ストア (「メトロ」) アプリで待機する方法を学習しています。私はプロパティに出くわし、Task.CurrentIdそれがどのように機能するかを理解しようとしました.

MSDNによると、「システムによって現在実行中のタスクに割り当てられた整数」が返されます。そこで、この値をカスタム ロガーに記録する機能を追加しましたが、驚いたことに、テスト アプリでnull.

この例を見てください:

private async void TestButton_Click(object sender, RoutedEventArgs e)
{
    int? id1 = Task.CurrentId;

    await Task.Delay(100);
    int? id2 = Task.CurrentId;

    StorageFolder folder = ApplicationData.Current.LocalFolder;
    StorageFile file = await folder.CreateFileAsync("test.txt", 
        CreationCollisionOption.OpenIfExists);
    int? id3 = Task.CurrentId;

    await FileIO.AppendTextAsync(file, "test");
    int? id4 = Task.CurrentId;

    await DoMoreAsync();
    int? id7 = Task.CurrentId;
}

private async Task DoMoreAsync()
{
    StorageFolder folder = ApplicationData.Current.LocalFolder;
    StorageFile file = await folder.CreateFileAsync("test.txt",
        CreationCollisionOption.OpenIfExists);
    int? id5 = Task.CurrentId;

    await FileIO.AppendTextAsync(file, "test");
    int? id6 = Task.CurrentId;
}

これらの ID はすべてnull. なんで?このコードはタスクを作成しますね。彼らはIDを持っているべきではありませんか?

4

2 に答える 2

17

を使用しているためasync / await、すべてのTask.CurrentId呼び出しは UI スレッドで行われます。

UI スレッドは ではないTaskため、null がありますCurrentId


を作成するTaskと、次のCurrentIdように設定されます。

int? idTask = await Task.Run( () => Task.CurrentId );
于 2013-01-18T12:45:48.847 に答える
13

MSDNによると、「システムによって現在実行中のタスクに割り当てられた整数」が返されます...このコードはタスクを作成しますよね?彼らはIDを持っているべきではありませんか?

そこで重要なのが「現在実行中」です。

には 2 つのタイプがあります。1Taskつのタイプのタスクはコードを実行し、もう 1 つのタイプのタスクは、ある種の操作またはイベントの単なる抽象表現です。たとえばTask.Run、スレッド プール スレッドでコードを実行するコード実行タスクを作成します。Task.Delayタイマーが起動したときに完了する操作/イベント タスクを作成します。

メソッドによって返されるタスクはasyncメソッド自体を表すため、実際にはコード タスクではなく操作/イベント タスクです。メソッド内のコードはasync、デリゲートとして、またはいくつかの異なるタスク (または両方の混合) として実行できます。CurrentIdメソッド内で from を取得してもasync(コード実行タスク内で実行していることを示します)、その ID はメソッドによって返されるタスクの ID (常に操作/イベント タスク) とは異なります。 .

于 2013-01-18T14:42:07.237 に答える