我怎样才能使用最简单的任务?

时间:2014-05-09 17:33:22

标签: c# windows-phone-7 windows-phone-8 asynchronous task

我说的是单线程(不是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

1 个答案:

答案 0 :(得分:1)

Task只是表示将来会完成的事情的一种方式。这通常是异步操作或在后台线程中运行的某些内容(通过Task.Run / TaskEx.Run)。

“同步纯Task”实际上没有意义 - Task的整个目的是表示不同步的东西。

  

在某些情况下可以有用(我有一个非常常见的应用程序从服务器提取数据,反序列化它并显示结果),

在这种情况下,由于数据是从服务器中提取的,因此本质上是异步操作的良好信息。这将使其成为Task(或Task<T>)的完美标记。


回复您的修改:

在第一个版本中,所有内容都是按顺序运行。

使用Task.Run的第二个版本实际上导致DoSmth()在后​​台线程中执行。如果您愿意,Task返回的await可以与DoSmth()一起使用,等待它完成。这意味着{{1}}可能会在分配给b(以及后续操作)的同时运行。