2

我有一个 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()”方法中获取值吗?

4

5 回答 5

1

您可能想查看新的 .NET Framework 4.0 异步库。具体来说,您可能会感兴趣:System.Threading.Tasks.Task<T>.

此类将用于代替 System.Threading.Thread。

于 2012-06-15T17:54:46.810 回答
0

考虑改用事件。当您的线程操作完成时触发一个事件。

于 2012-06-15T17:55:40.360 回答
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 代码。与此处描述的内容非常相似。

于 2012-06-15T18:02:04.930 回答
0

线程不是.net中的方法和线程,其设计方式是异步运行且无法返回值。

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

此外,您可以检查此项以了解从线程返回值的不同技术。

于 2012-06-15T18:40:38.753 回答
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";
   }
}
于 2013-09-02T10:45:36.263 回答