如何完成任务?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吗?
因为你使用的是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不同(该方法始终是操作/事件任务)。