
C#如何接收另一个线程的返回值
在start函数中启动一个线程,每隔5秒钟执行一次Keep函数,现在我需要在start函数中知道Keep函数的返回值。timer的委托事件是不是不能有返回值?该怎么办,求...
在start函数中启动一个线程,每隔5秒钟执行一次Keep函数,现在我需要在start函数中知道Keep函数的返回值。timer的委托事件是不是不能有返回值?该怎么办,求大虾指点啊。
public void start(object ob)
{
t = new System.Timers.Timer(5000); //Create a timer to keep certification
t.Elapsed += new ElapsedEventHandler(keep); //call the method "keep" every five seconds to keep certification
t.Start(); //start timer
}
private void keep(object source, ElapsedEventArgs e)
{///向服务器发送一条消息
Message msg = new Message();
msg.SetType(11);
msg.AddParameter(clientID);
Message smsg = this.SendAndReceive(msg);//发送消息,服务器返回一条消息smsg
if (smsg.messageType == 0) //如果消息种类是0,则说明有错误,应该返回错误信息“error”
{
return “error”;
}
} 展开
public void start(object ob)
{
t = new System.Timers.Timer(5000); //Create a timer to keep certification
t.Elapsed += new ElapsedEventHandler(keep); //call the method "keep" every five seconds to keep certification
t.Start(); //start timer
}
private void keep(object source, ElapsedEventArgs e)
{///向服务器发送一条消息
Message msg = new Message();
msg.SetType(11);
msg.AddParameter(clientID);
Message smsg = this.SendAndReceive(msg);//发送消息,服务器返回一条消息smsg
if (smsg.messageType == 0) //如果消息种类是0,则说明有错误,应该返回错误信息“error”
{
return “error”;
}
} 展开
3个回答
展开全部
如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了
变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~
如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~
其实你这个思路是错误的:
根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。
1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。
2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~
你可以说一下你的目的是什么吗? 就你的描述来看,你根本没必要用线程。。。
从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。 如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。
总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。
===================================================================
public string ThreadTryRequest(string strUrl, string parm)
{
Thread thrOne = new Thread(this.ThreadProc); //创建线程
ThreadParameter parameter = new ThreadParameter(); //实例化ThreadParameter对象,并赋值
parameter.StrUrl = strUrl.ToString();
parameter.parm = parm.ToString();
thrOne.Start(parameter); //开启线程
return strState; //返回字符串
}
你想在这里就获取到值? 那是获取不到的.... return strState; 执行了
this.ThreadProc(parameter) 还没执行完了,这个时候strState 还没被赋值,
所以我说你的思路是错误的....
你想当时就知道一个线程的执行结果,除非你等~~~ 要不获取不到的~~~
变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~
如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~
其实你这个思路是错误的:
根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。
1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。
2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~
你可以说一下你的目的是什么吗? 就你的描述来看,你根本没必要用线程。。。
从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。 如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。
总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。
===================================================================
public string ThreadTryRequest(string strUrl, string parm)
{
Thread thrOne = new Thread(this.ThreadProc); //创建线程
ThreadParameter parameter = new ThreadParameter(); //实例化ThreadParameter对象,并赋值
parameter.StrUrl = strUrl.ToString();
parameter.parm = parm.ToString();
thrOne.Start(parameter); //开启线程
return strState; //返回字符串
}
你想在这里就获取到值? 那是获取不到的.... return strState; 执行了
this.ThreadProc(parameter) 还没执行完了,这个时候strState 还没被赋值,
所以我说你的思路是错误的....
你想当时就知道一个线程的执行结果,除非你等~~~ 要不获取不到的~~~
展开全部
Timer.Elapsed的委托类型你肯定是不能修改的,只能通过别的方式来接受返回值,楼上说的用全局字段的方法不是很好,因为你不知道什么时候去读取这个字段,最好通过事件响应的方式来获得返回值。
delegate void myDelegate(object param);//创建一个自定义委托,也可直接用系统委托
event myDelegate myEvent;//声明一个事件
this.myEvent += this.OnEvent(object param);//绑定事件的响应方法,可以放在构造函数里
void OnEvent(object param)//事件响应
{
//处理返回值
}
void keep(object source, ElapsedEventArgs e)//你的timer
{
//do somthing
object param = null;
if(myEvent != null)
myEvent(param);//触发事件,抛出返回值
}
delegate void myDelegate(object param);//创建一个自定义委托,也可直接用系统委托
event myDelegate myEvent;//声明一个事件
this.myEvent += this.OnEvent(object param);//绑定事件的响应方法,可以放在构造函数里
void OnEvent(object param)//事件响应
{
//处理返回值
}
void keep(object source, ElapsedEventArgs e)//你的timer
{
//do somthing
object param = null;
if(myEvent != null)
myEvent(param);//触发事件,抛出返回值
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在本类中增加一个字段t,在keep里使它的值变化,在另外的地方访问它就是了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询