如何完成任务?CurrentId工作

本文关键字:CurrentId 工作 完成任务 | 更新日期: 2023-09-27 17:54:25

我目前正在学习如何使用任务,异步和等待在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;
}

这些id都是null。为什么?这段代码创建了任务,不是吗?他们不应该有id吗?

如何完成任务?CurrentId工作

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

UI线程不是Task,所以它有一个空的CurrentId


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

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

根据MSDN,它返回"一个由系统分配给当前执行任务的整数"…这段代码创建了任务,不是吗?他们不应该有id吗?

这里的键是"current - execution "

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

async方法返回的任务代表方法本身,因此它们实际上是操作/事件任务而不是代码任务。async方法中的代码可以作为委托或几个不同的任务(或两者的混合)运行。即使您确实从async方法中获得CurrentId(这表明您正在代码执行任务中运行),该id也会与该方法返回的任务id不同(该方法始终是操作/事件任务)。