我有一个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()”方法获取值的任何建议吗?
答案 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";
}
}