取多线程方法返回值

bin0451 2014-11-07 03:46:47
在类A中调用类B 的方法Method1,Method1是一个多线程的方法,
string str = "";
while(true)
{
switch (xxx)
{
case "A":
str = "xxxxxxxxxx";
break;
case "B" :
}
}

如何在类A中获取 Method1方法中的str值
...全文
488 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mlqxj35674 2014-11-07
  • 打赏
  • 举报
回复
使用异步委托调用,如果你需要该方法返回的结果,则BeginInvoke的返回值很重要,BgeinInvoke将返回一个IAsyncResult,这可以和委托的EndInvoke配合使用,以在方法调用完毕后检索调用结果
於黾 2014-11-07
  • 打赏
  • 举报
回复
引用 7 楼 bin0451 的回复:
while(true) { // } 如何将结果返给 类A中,线程还要继续,最好给点代码说明
1.在类B里放个全局public变量,类A中访问 2.在类A里放个全局public数组,类B里线程直接写入数组
xdashewan 2014-11-07
  • 打赏
  • 举报
回复
引用 7 楼 bin0451 的回复:
while(true) { // } 如何将结果返给 类A中,线程还要继续,最好给点代码说明
楼主去学一下关于委托的知识,给你个简单例子

 class Program
     {
         static void Main(string[] args)
         {
             MainThreadClass mt = new MainThreadClass();
             mt.Start();
         }
     }

     public class MainThreadClass
     {
         string[] arrStr = new string[] { "Microsoft", "IBM", "Oracle" };

         public void Start()
         {
             foreach (string str in arrStr)
             {
                 SubTreadClass st = new SubTreadClass();
                 st.Completed += new EventHandler(st_Completed);
                 ThreadStart ts = new ThreadStart(st.Method);
                 Thread th = new Thread(ts);
                 th.Name = str;
                 th.Start();
             }
         }

         void st_Completed(object sender, EventArgs e)
         {
             Console.WriteLine("Thread completed.");
         }


     }

     public class SubTreadClass
     {

         private event EventHandler m_eventCompleted = null;

         public event EventHandler Completed
         {
             add { m_eventCompleted += value; }
             remove { m_eventCompleted -= value; }
         }

         public void Method()
         {
             Console.WriteLine(string.Format("Current thread:{0}:{1}", Thread.CurrentThread.Name,
                 "MyClass.Method() executed."));
             if (m_eventCompleted != null)
             {
                 m_eventCompleted(this, EventArgs.Empty);
             }
         }
     }
xdashewan 2014-11-07
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
看好楼主的代码里,确实的有个while(true),这样回调函数其实才是不靠谱的做法
回调是一种机制,不是只有回调方法才算是回调,通过委托也能实现回调,谁告诉你回调就一定是最后执行,既然是无限循环,完全可以通过委托来回调,根据情况还能关闭线程,全局变量一般读取用的多,即使这样都还得很注意。在拿返回值的时候用,这完全是新手的做法
bin0451 2014-11-07
  • 打赏
  • 举报
回复
while(true) { // } 如何将结果返给 类A中,线程还要继续,最好给点代码说明
於黾 2014-11-07
  • 打赏
  • 举报
回复
看好楼主的代码里,确实的有个while(true),这样回调函数其实才是不靠谱的做法
於黾 2014-11-07
  • 打赏
  • 举报
回复
引用 4 楼 xdashewan 的回复:
[quote=引用 3 楼 Z65443344 的回复:] 1.线程封装到类里去,每次实例化一个,类里开线程,线程把返回值写入public类型的变量里,这样A就能获取到了 2.给线程注册回调函数(用委托) 3.不要用局部变量str,而是弄个全局数组,线程把结果直接写到全局数组里,这样你在工程的每个文件里都能获取它的值了
第二条完全没有问题,第一第三条你自己觉得真的妥当吗? 第一多线程异步操作你能知道什么时候完成?你准备是阻塞主线程等完成还是准备再开个监视线程去监控返回? 第二都多线程不等于主线程+一个子线程,而是+n个子线程,既然是n个子线程,那么完成谁先谁后是无法保证的,你准备开个数组让线程排队还是按号码去填空吗? 如果拿返回值真的如此简单,那微软还要设计回调函数干嘛使呢?[/quote] 回调函数当然是线程执行完了才会执行的 但是如果是线程死循环,不退出,然后不断的产生数据,那么也只能用1和3了 主线程轮询呗
xdashewan 2014-11-07
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
1.线程封装到类里去,每次实例化一个,类里开线程,线程把返回值写入public类型的变量里,这样A就能获取到了 2.给线程注册回调函数(用委托) 3.不要用局部变量str,而是弄个全局数组,线程把结果直接写到全局数组里,这样你在工程的每个文件里都能获取它的值了
第二条完全没有问题,第一第三条你自己觉得真的妥当吗? 第一多线程异步操作你能知道什么时候完成?你准备是阻塞主线程等完成还是准备再开个监视线程去监控返回? 第二都多线程不等于主线程+一个子线程,而是+n个子线程,既然是n个子线程,那么完成谁先谁后是无法保证的,你准备开个数组让线程排队还是按号码去填空吗? 如果拿返回值真的如此简单,那微软还要设计回调函数干嘛使呢?
於黾 2014-11-07
  • 打赏
  • 举报
回复
1.线程封装到类里去,每次实例化一个,类里开线程,线程把返回值写入public类型的变量里,这样A就能获取到了 2.给线程注册回调函数(用委托) 3.不要用局部变量str,而是弄个全局数组,线程把结果直接写到全局数组里,这样你在工程的每个文件里都能获取它的值了
忘丿殇 2014-11-07
  • 打赏
  • 举报
回复
你是想A可以用这个方法,还是要B中这个方法返回的值?
xdashewan 2014-11-07
  • 打赏
  • 举报
回复
线程返回用委托或者回调函数

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧