Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要在任务C#中使用结果?_C#_.net_Multithreading_Asynchronous - Fatal编程技术网

为什么要在任务C#中使用结果?

为什么要在任务C#中使用结果?,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我已经看到,当您像这样使用任务类时: Task<Test> task2 = Task<Test>.Factory.StartNew(() => { string s = ".NET"; double d = 4.0; for (int i = 0; i < 3; i++) { } return new Tes

我已经看到,当您像这样使用任务类时:

 Task<Test> task2 = Task<Test>.Factory.StartNew(() =>
            {
                string s = ".NET";
                double d = 4.0;
                for (int i = 0; i < 3; i++) { }
                return new Test { Name = s, Number = d };
            });
tasktask2=Task.Factory.StartNew(()=>
{
字符串s=“.NET”;
双d=4.0;
对于(int i=0;i<3;i++){
返回新的测试{Name=s,Number=d};
});
您可以使用
testtt=task2.Result
任务
返回结果。然而,线程并不是在后台运行的,我的整个程序都在等待它停止并发送数据回来,所以我为什么还要使用这个呢?我可以简单地使用一个函数

所以,为了返回结果,我需要运行另一个将运行此任务的任务?(或者其他线程,没关系)

有没有办法不等待,仍然得到结果

有没有办法不等待,仍然得到结果

不,因为在任务完成之前不会有结果

关键是,您可以维护对任务的引用,执行一些其他操作,然后获得结果

请注意,C#5使使用
async
await
将异步操作链接在一起变得更加容易-这样,当操作X需要等待操作Y完成时,它可以等待它,并且操作X的调用者可以获得表示正在进行的操作的任务。。。当Y完成时,X将继续,当完成时,任务返回给调用者也将完成

有没有办法不等待,仍然得到结果

是的,您将使用延续。这也可以安排在当前同步上下文上运行(因此,如果您在UI应用程序中,也可以在UI线程中运行)

这看起来像:

Task<Test> task2 = Task.Factory.StartNew(() =>
{
    string s = ".NET";
    double d = 4.0;
    for (int i = 0; i < 3; i++) { }
    return new Test { Name = s, Number = d };
});

task2.ContinueWith(t =>
{
    // This runs when things are done
    Test tt = t.Result;
    // use tt
}, TaskScheduler.FromCurrentSynchronizationContext());
tasktask2=Task.Factory.StartNew(()=>
{
字符串s=“.NET”;
双d=4.0;
对于(int i=0;i<3;i++){
返回新的测试{Name=s,Number=d};
});
任务2.继续使用(t=>
{
//当事情完成时,它就会运行
试验tt=t.结果;
//使用tt
},TaskScheduler.FromCurrentSynchronizationContext());
如果您使用的是C#5和.NET 4.5,这将变得简单得多:

Test tt = await Task.Run(() =>
{
    string s = ".NET";
    double d = 4.0;
    for (int i = 0; i < 3; i++) { }
    return new Test { Name = s, Number = d };
});

// use tt
testtt=等待任务。运行(()=>
{
字符串s=“.NET”;
双d=4.0;
对于(int i=0;i<3;i++){
返回新的测试{Name=s,Number=d};
});
//使用tt

结果
是一个阻塞调用。您可能想研究continuations或使用async\await。要使用它,我需要让运行此wait的类等待,对吗?|@Pixie1993对于第二部分,您需要将它放在标记为
async
的方法中,请注意给定一个函数的exmaple,该函数带有aysc任务,将返回一个字符串hello?