我目前正在学习如何在Windows Store(“地铁”)应用程序中使用任务,异步和等待。我偶然发现了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。为什么?这段代码确实创建了任务,不是吗?他们不应该有身份证吗?

最佳答案

因为您使用的是async / await,所以所有Task.CurrentId调用都在UI线程上进行。

UI线程不是Task,因此它具有空CurrentId
如果创建Task,则会设置其CurrentId:

int? idTask = await Task.Run( () => Task.CurrentId );

关于c# - Task.CurrentId如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14399232/

10-10 07:53