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