C# 获取回调中threadstarter委托的返回值

C# 获取回调中threadstarter委托的返回值,c#,multithreading,C#,Multithreading,我有一个简单的控制台应用程序,当它被执行时: 1-在新线程中启动一个方法,该方法在一段时间后显示在控制台“生成值完成” 2-立即显示“主线程已完成” 这是我的代码: static void Main(string[] args) { Start(); Console.WriteLine("main thread is finished"); Console.ReadLine(); } private static

我有一个简单的控制台应用程序,当它被执行时:

1-在新线程中启动一个方法,该方法在一段时间后显示在控制台“生成值完成”
2-立即显示“主线程已完成”

这是我的代码:

    static void Main(string[] args)
    {
        Start();
        Console.WriteLine("main thread is finished");
        Console.ReadLine();
    }

    private static int GenerateValue(int value)
    {
        int milliseconds = 10000;
        Thread.Sleep(milliseconds);
        return value*2;
    }

    private static void Start()
    {
        ThreadStart starter = () => GenerateValue(5);
        starter += () =>
        {
            Console.WriteLine("generate value is finished");
        };
        Thread thread = new Thread(starter) { IsBackground = true };
        thread.Start();
    }
我想带来的改进是除了显示“生成值已完成”外,还显示生成的值,例如这里的“10”

但是我看不到如何在委托回调中访问“GenerateValue(5)”返回的值:


您可以通过关闭来实现这一点:

private static void Start()
{
    int returnValue = 0;
    ThreadStart starter = () =>
    {
        returnValue = GenerateValue(5);
    };
    starter += () =>
    {
        Console.WriteLine("generate value is finished. Returned value is {0}", returnValue);
    };
    Thread thread = new Thread(starter) { IsBackground = true };
    thread.Start();
}

你为什么要把两个lambda组合在一起,而不是在一个lambda中完成所有的工作?你能详细说明你的答案吗?这不是答案。这是个问题。你为什么一开始就把两个独立的lambda组合在一起?这真是个坏主意。它非常脆弱,而且比需要的更迟钝、更难阅读。@CodeFuller您的建议甚至没有从线程返回值。它只是在生成值后将值写入控制台,这可以通过在同一个委托中包含两行代码来完成。正确,但我相信user2443476只是发布了一个最小、完整且可验证的示例。他的最终意图是从线程返回值。我的回答显示了如何通过闭包来实现这一点。
private static void Start()
{
    int returnValue = 0;
    ThreadStart starter = () =>
    {
        returnValue = GenerateValue(5);
    };
    starter += () =>
    {
        Console.WriteLine("generate value is finished. Returned value is {0}", returnValue);
    };
    Thread thread = new Thread(starter) { IsBackground = true };
    thread.Start();
}