【问题标题】:Why should I use Result in Tasks C#?为什么我应该在 Tasks C# 中使用 Result?
【发布时间】:2015-06-09 19:47:54
【问题描述】:

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

 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 };
            });

您可以使用Test tt = task2.Result;Task 获取结果。但是,线程不在后台运行,我的整个程序都在等待它停止并将数据发回,那我为什么还要使用它呢?我可以简单地使用一个函数。

那么,为了获得结果,我需要运行另一个任务来运行此任务吗? (或另一个线程,没关系)。

有没有什么方法可以不等待而仍然得到结果?

【问题讨论】:

  • Result 是一个阻塞调用。您可能想研究延续或使用 async\await。

标签: c# .net multithreading asynchronous


【解决方案1】:

有什么方法可以不等待并且仍然得到结果?

没有,因为在任务完成之前没有结果。

重点是你可以维护一个对任务的引用,执行一些其他的操作,然后然后得到结果。

请注意,C# 5 使用 asyncawait 使异步操作更容易链接在一起 - 这样当操作 X 需要等待操作 Y 完成时,它可以等待它,并且操作的调用者X 得到一个代表正在进行的操作的任务...当 Y 完成时,X 将恢复,当完成时,返回给调用者的任务也将完成。

【讨论】:

    【解决方案2】:

    有什么方法可以不等待仍然得到结果?

    是的,您将使用延续。这可以安排在当前同步上下文上运行(因此,如果您在 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());
    

    如果您使用的是 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
    

    【讨论】:

    • 为了我使用它,我需要让运行这个的类等待,对吧?|
    • @Pixie1993 对于第二部分,您需要将其放在标记为async的方法中
    • 介意给出一个带有aysc任务的函数的例子,它将返回一个字符串说你好?
    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 2010-12-30
    • 2010-11-18
    • 1970-01-01
    • 2011-03-10
    • 2010-10-05
    • 2016-08-07
    相关资源
    最近更新 更多