C#从ThreadStart()返回值.Start()

时间:2012-06-15 17:47:30

标签: c# delegates

我有一个Windows窗体,我在其中打开用于服务器通信的新线程。 我需要在表单中(在文本框中)写出服务器如何响应查询。

目前,我按如下方式进行服务器通信:

ServerClass SC = new ServerClass(param);
new Thread(new ThreadStart(SC.serverAction)).Start()

现在的serverAction是ServerClass类中的void方法,但我可以在需要时返回一个值。但是我更倾向于代表,但我不太确定如何从其他线程回电...

ServerClass是一个使用WCF的简单类,如下所示:

public class ServerClass
{
  private string var1;
  private string var2;

  public ServerClass(string var1, string var2)
  {
    this.var1 = var1; this.var2 = var2;
  }
  public void serverAction()
  {
    //WCF here
  }
}

有关如何从“serverAction()”方法获取值的任何建议吗?

5 个答案:

答案 0 :(得分:1)

您可能希望查看新的.NET Framework 4.0异步库。具体而言,您可能会对此感兴趣:System.Threading.Tasks.Task<T>

此类将用于System.Threading.Thread。

答案 1 :(得分:0)

考虑使用事件。在线程操作完成后触发事件。

答案 2 :(得分:0)

好吧,你无法从线程的入口点返回一个值。 我建议的是Server类之间的某种异步通信。

您可以在Server类中定义一个事件,例如:

public event EventHandler<YourEventInformation> OnServerConnected = (s, e) => {};

然后,当serverAction准备就绪时,您可以执行以下操作:

YourEventInformation evtInfo [= new YourEventInformation();
evtInfo.CustomReturnValue = "something here";

//Async call in the UI thread
OnServerConnected.BeginInvoke(this, evtInfo, null, null);

接下来,您需要从UI(可能是Window)的某个位置绑定到此事件。 在那里,您需要在UI线程的上下文中调用您的代码,首先检查Dispatcher.CheckAccess,然后调用您的UI代码。 与描述here的内容非常相似。

答案 3 :(得分:0)

  

线程不是.net中运行的方法和线程   异步并且不能返回值。

但您可以使用BackgroundWorker返回值。您可以在e.Result中的BackgroundWorker中获得结果。

此外,您可以检查this是否有不同的技术从线程返回值。

答案 4 :(得分:0)

您可以使用此代码

class Program
 {
 static void Main(string[] args)
{
    string returnValue = null;
   new Thread(
      () =>
      {
          returnValue =test() ; 
      }).Start();
    Console.WriteLine(returnValue);
    Console.ReadKey();
  }
    public static string test()
   {
     return "Returning From Thread called method";
   }
}