我目前正在学习如何在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/