我如何使用最简单的任务
本文关键字:任务 最简单 何使用 | 更新日期: 2023-09-27 18:02:40
我说的是单线程(不是WindowsPhone的TaskEx)(好吧,即使是基本的Task也被设计为异步的,这使得问题毫无意义)和同步(没有async/await)纯Task
。
可以在某些情况下是有用的(我有相当常见的应用程序,从服务器提取数据,反序列化它并显示结果),或者是Task
只是一个地下室
await TaskEx.Run()?
我的意思是,这如何
void Foo()
{
DoSmth();
}
void Main()
{
int a = 1;
Foo();
int b = 1;
}
不同于
void Main()
{
int a = 1;
Task.Run( () => DoSmth );
int b = 1;
}
调用Foo();
也有点像"承诺下一个代码将在Foo()完成后调用"。
编辑2:我刚刚运行在wp7应用程序
Debug.WriteLine("OnLoaded {0} ", Thread.CurrentThread.ManagedThreadId);
Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
Debug.WriteLine("Run Id: {0}", Thread.CurrentThread.ManagedThreadId);
});
Debug.WriteLine("Done");
得到输出:
OnLoaded 1
Done
Run Id: 4
那么,Task.Factory.StartNew()
是否与TaskEx.Run()
相同呢?
ESIT3:所以,这里是一个简短的总结(因为Task.Factory.StartNew()
和TaskEx.Run()
是一样的):
Thread.Sleep(5000); // UI is frozen for 5 seconds
int a = 1; // this is called after 5 seconds
TaskEx.Run(() =>
{
Thread.Sleep(5000);
int a = 1; // this is called after 5 seconds
}
int b = 2; // UI is not frozen, this is called instantly
await TaskEx.Run(() => // UI is not frozen, but...
{
Thread.Sleep(5000);
int a = 1; // this is called after 5 seconds
}
int b = 2; // this is called then task is done
Task
只是表示将来会完成的事情的一种方式。这通常是一个异步操作或在后台线程中运行的东西(通过Task.Run
/TaskEx.Run
)。
一个"纯同步的Task
"真的没有意义——Task
的全部目的就是表示一些不同步的东西。
可以在某些情况下是有用的(我有相当常见的应用程序,从服务器提取数据,反序列化它并显示结果),
在这种情况下,由于数据是从服务器提取的,因此从本质上来说,这是异步操作的良好候选。这将使它成为Task
(或Task<T>
)的完美候选者。
回复你的编辑:
在第一个版本中,所有内容都是顺序运行的。
第二个版本,使用Task.Run
,实际上导致DoSmth()
在后台线程中执行。返回的Task
可以与await
一起使用,以异步方式等待它完成,如果您想这样做的话。这意味着DoSmth()
可能会在对b赋值(以及后续操作)的同时运行。