我说的是单线程(不是WindowsPhone的TaskEx)(好吧,即使是基本的任务设计为异步,这使得问题毫无意义)和同步(没有异步/等待)纯Task
。
在某些情况下可以有用(我有一个非常常见的应用程序从服务器提取数据,反序列化并显示结果),或Task
只是
await TaskEx.Run()?
EDIT1:我的意思是,这是怎么回事。
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()完成后调用下一个代码”。
EDIT2:我刚刚在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
答案 0 :(得分:1)
Task
只是表示将来会完成的事情的一种方式。这通常是异步操作或在后台线程中运行的某些内容(通过Task.Run
/ TaskEx.Run
)。
“同步纯Task
”实际上没有意义 - Task
的整个目的是表示不同步的东西。
在某些情况下可以有用(我有一个非常常见的应用程序从服务器提取数据,反序列化它并显示结果),
在这种情况下,由于数据是从服务器中提取的,因此本质上是异步操作的良好信息。这将使其成为Task
(或Task<T>
)的完美标记。
回复您的修改:
在第一个版本中,所有内容都是按顺序运行。
使用Task.Run
的第二个版本实际上导致DoSmth()
在后台线程中执行。如果您愿意,Task
返回的await
可以与DoSmth()
一起使用,等待它完成。这意味着{{1}}可能会在分配给b(以及后续操作)的同时运行。