11

我目前正在学习如何在 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. 为什么?这段代码确实创建了任务,不是吗?他们不应该有身份证吗?

4

2 回答 2

17

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

UI 线程不是 a Task,所以它有一个 nullCurrentId


如果您创建一个TaskCurrentId它将被设置:

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

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

那里的关键是“当前正在执行”。

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

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

于 2013-01-18T14:42:07.237 回答