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,它返回"由系统分配给当前正在执行的任务的整数"...这段代码确实创建了任务,不是吗?他们不应该有身份证吗?
关键是"当前正在执行".
有两种类型的Task
s:一种类型的任务执行代码,另一种类型的任务只是某种操作或事件的抽象表示.例如,Task.Run
将创建一个代码执行任务,该任务将在线程池线程上执行其代码; Task.Delay
将创建一个操作/事件任务,该任务在计时器触发时完成.
async
方法返回的任务代表方法本身,因此它们实际上是一个操作/事件任务而不是代码任务.async
方法中的代码可以作为委托或作为几个不同的任务(或两者的混合)运行.即使你CurrentId
从一个async
方法中获得了一个(表明你在代码执行任务中运行),该id也将不同于该方法返回的任务的id(它总是一个操作/事件任务) .
归档时间: |
|
查看次数: |
13150 次 |
最近记录: |