Task.CurrentId如何工作?

Seb*_*zus 8 .net c# windows-store-apps

我目前正在学习如何在Windows应用商店("Metro")应用中使用任务,异步和等待.我偶然发现了该物业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;
}
Run Code Online (Sandbox Code Playgroud)

所有这些都是null.为什么?这段代码确实创建了任务,不是吗?他们不应该有身份证吗?

Nic*_*ler 13

因为您正在使用async / await,所有Task.CurrentId调用都发生在UI线程上.

UI线程不是a Task,因此它具有nullCurrentId


如果你创建了一个Task,CurrentId它将被设置:

int? idTask = await Task.Run( () => Task.CurrentId );
Run Code Online (Sandbox Code Playgroud)


Ste*_*ary 11

根据MSDN,它返回"由系统分配给当前正在执行的任务的整数"...这段代码确实创建了任务,不是吗?他们不应该有身份证吗?

关键是"当前正在执行".

有两种类型的Tasks:一种类型的任务执行代码,另一种类型的任务只是某种操作或事件的抽象表示.例如,Task.Run将创建一个代码执行任务,该任务将在线程池线程上执行其代码; Task.Delay将创建一个操作/事件任务,该任务在计时器触发时完成.

async方法返回的任务代表方法本身,因此它们实际上是一个操作/事件任务而不是代码任务.async方法中的代码可以作为委托或作为几个不同的任务(或两者的混合)运行.即使你CurrentId从一个async方法中获得了一个(表明你在代码执行任务中运行),该id也将不同于该方法返回的任务的id(它总是一个操作/事件任务) .