【问题标题】:Is method without async returning value using Task.Run a bad practice?使用 Task.Run 没有异步返回值的方法是不好的做法吗?
【发布时间】:2017-12-10 20:29:29
【问题描述】:

我不经常看到这种模式,所以我想知道下面的方法有什么问题吗?

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(GetText());
        }
    }

    public static string GetText()
    {
        string result = "";
        Task.Run(() => result = Environment.TickCount.ToString()).Wait();
        return result;
    }
}

另外,有人可以解释为什么我得到“不是所有路径返回值”编译器错误:

    public static string GetText()
    {           
        Task.Run(() => { return Environment.TickCount.ToString();  }).Wait();            
    }

【问题讨论】:

  • 在开始使用多线程之前,您需要阅读一些基础知识。这不太对。 (我假设您是初学者,否则您不会问第二个问题。)
  • 返回需要在Wait()之后。所以 return Task.Run(() => { yield Environment.TickCount.ToString(); }).Wait();
  • Task.Run(...).Wait(); 只是意味着你想阻止 2 个线程而不是 1 个。
  • 任务不一定使用第二个线程。它可能只会在主线程上运行
  • @JoePhillips Task.Run 始终使用线程池任务调度程序,因此它将始终在第二个线程上运行。 Task.Factory.StartNew depending on the situation 最终可能会在 UI 线程上执行任务。

标签: c# asynchronous task


【解决方案1】:

您不经常看到这种模式的原因是因为它什么都不做。您正在创建任务以在单独的线程上运行,但您也立即要求您的主线程等待另一个线程完成。那里没有价值。多线程的重点是让调用线程继续运行,而其他线程做其他工作。

对于您的第二个问题:您的 return 语句存在于您提供的 lambda 中(lambda 是 () => {} 表示法)。当你调用 Task.Run 时,你是在告诉编译器“启动一个新线程,当线程准备就绪时,执行我将要给你的代码”。 lambda 是应该在另一个线程中执行的代码。它不会在调用 Task.Run 的线程中执行。就 GetText() 而言,您从未调用过 return,也从未返回过值。这就是编译器告诉你有问题的原因。

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 2021-05-07
    • 2010-11-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多