我如何使用最简单的任务



我说的是单线程(不是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赋值(以及后续操作)的同时运行。

最新更新