【问题标题】:C# Return value from ThreadStart().Start()C# 从 ThreadStart().Start() 返回值
【发布时间】:2013-09-02 18:45:36
【问题描述】:

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

【问题讨论】:

  • 您使用的是什么版本的 .NET?

标签: c# delegates


【解决方案1】:

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

此类将用于 System.Threading.Thread。

【讨论】:

  • 为什么投反对票?这个答案是在作者表示他们正在使用 .NET Framework 3.5 之前发布的,并且可能仍然对访问此页面的其他人有所帮助。
【解决方案2】:

嗯,你不能从线程的入口点准确地返回一个值。 我建议的是 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 的某个位置(可能是窗口)绑定到此事件。 您只需在 UI 线程的上下文中调用您的代码,首先检查 Dispatcher.CheckAccess 然后调用您的 UI 代码。 与here 描述的内容非常相似。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        您可以使用此代码

        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";
           }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-08-15
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多