none
多线程完成多个任务 RRS feed

  • 问题

  • 各位大侠,小弟刚接触多线程编程,请各位帮忙解决一下问题:
    现有, 一个WebService Heart  与 实体类 Terminal
        class Terminal
        {
            public string name;

            //构造函数
            public Terminal(string name)
            {
                this.name = name;
            }

            //执行动作
            public string DoSomething(int i)
            {
                if (i == 1)
                {
                    return this.name + "DoSomething_one";
                }
                else
                {
                    return this.name + "DoSomething_two";
                }
            }

        }

    Heart提供接口函数 int CommonHeart()

    我想用多线程来完成以下动作:
    同时模拟5个Terminal,
    每个Terminal每间隔1秒钟访问Heart的CommonHeart一次,把CommonHeart的返回值作为参数去执行Terminal的DoSomething函数,
    并把DoSomething的返回值在窗体应用程序上的textbox上打印出来。
    请各位给一个详细点的代码,谢谢。

    2010年1月16日 14:16

答案

  • 你好!
         你可以定义多个Timer来实现!
    周雪峰
    2010年1月17日 8:22
    版主
  • 可以使用 Thread 或者 ThreadPool 来模拟多个 Terminal。

    您先写一个 Foo() 方法,方法里面类似于:

    while (true)
    {
       Thread.Sleep(1000);
        int returnValue = heart.CommonHeart();
        Terminal.DoSomething(returnValue);
    }

    然后去 new 几个线程,把它们都 start 即可。

    Thread[] threads = new[] { new Thread(Foo), new Thread(Foo), ... };

    foreach(Thread thread in threads)
    {
        thread.Start();
    }

    至于如何把结果输出到 Form 的 TextBox,则在 Foo 方法中利用 form.Invoke() 方法直接操作 TextBox.Text 属性就可以了。
    Mark Zhou
    2010年1月21日 9:35

全部回复

  • 各位大侠,小弟刚接触多线程编程,请各位帮忙解决一下问题:
    现有两个类,Heart  与 实体类 Terminal
        class Terminal
        {
            public string name;

            //构造函数
            public Terminal(string name)
            {
                this.name = name;
            }

            //执行动作
            public string DoSomething(int i)
            {
                if (i == 1)
                {
                    return this.name + "DoSomething_one";
                }
                else
                {
                    return this.name + "DoSomething_two";
                }
            }

        }



        class Heart
        {
            public Heart()
            {
            }

            public int CommonHeart()
            {
                Random random = new Random(3);
                int result = random.Next();
                if (result == 1)
                {
                    return 1;
                }
                else
                {
                    return 2;
                }
            }

        }

    我想用多线程来完成以下动作:
    同时模拟5个Terminal,
    每个Terminal每间隔1秒钟访问Heart的CommonHeart一次,把CommonHeart的返回值作为参数去执行Terminal的DoSomething函数,
    并把DoSomething的返回值在窗体应用程序上的textbox上打印出来。
    请各位给一个详细点的代码,谢谢。

    2010年1月16日 14:24
  • 没有哪位大侠能帮个忙么?跪求啊
    2010年1月17日 0:36
  • 你好!
         我在另外一个同样的帖子中已经做了回复,我们在那里交流!
         注意,请不要重复发帖,以免给其他用户浏览帖子造成不必要的麻烦!
    周雪峰
    2010年1月17日 4:15
    版主
  • 你好!
         你可以订阅Timer的Elapsed事件来实现!
         private System.Timers.Timer timer=new System.Timers.Timer(1000);
         ...
         timer.Elapsed+=new ElapsedEventHandler(timer_Elapsed);

         ...
         protected void timer_Elapsed(object sender,ElapsedEventArgs e)
         {
                  int i=myHeart.CommonHeart();
                  ...
          }
          希望对你有帮助!
    周雪峰
    2010年1月17日 4:22
    版主
  • 谢谢
    可是这样实现不了同时有多个Terminal并发的访问Heart和执行DoSomething啊,能再给详细一点么?
    2010年1月17日 7:32
  • 你好!
         你可以定义多个Timer来实现!
    周雪峰
    2010年1月17日 8:22
    版主
  •   protected void timer_Elapsed(object sender,ElapsedEventArgs e)
         {
                  int i=myHeart.CommonHeart();
                  ...
          }
    我想在int i=myHeart.CommonHeart();后执行Terminal类的DoSomething(int i),请问这个Terminal在哪里定义呢?
    注:有多个Terminal
    谢谢
    2010年1月17日 12:24
  • 你好!
         可以定义为类的成员变量!
    周雪峰
    2010年1月17日 12:47
    版主
  • 你好 你可以在 CommonHeart这个方法中进行线程同步

    这里你需要5个 那么可以使用 Semaphore 类来控制信号量的大小比如这里设置最大信号量为5  就可以限定同时最多5个线程可以访问同步资源
    http://msdn.microsoft.com/zh-cn/library/ms228964.aspx


    Memory all alone in the moonlight~My Blog in .NET~~~
    2010年1月18日 9:02
    版主
  • 在这里,其实Heart本来是webService,所以我不能对heart做任何动作,Terminal只能按照心跳的时间来访问这个webservice的接口函数。所以不能把Terminal定义为Heart的成员变量。
    能有别的解决办法么?

    2010年1月19日 12:47
  • 谢谢
    在这里其实Heart是一个webservice,提供一个接口函数 int CommonHeart(); 实体类 Terminal
        class Terminal
        {
            public string name;

            //构造函数
            public Terminal(string name)
            {
                this.name = name;
            }

            //执行动作
            public string DoSomething(int i)
            {
                if (i == 1)
                {
                    return this.name + "DoSomething_one";
                }
                else
                {
                    return this.name + "DoSomething_two";
                }
            }

        }

    我的目的是同时有多个Terminal,每个Terminal 按照心跳时间1秒来访问webservice  Heart的 CommonHeart();把这个CommonHeart()返回的值作为参数执行Terminal自身的
     DoSomething(int i)。
    有什么好的方法能够实现么?

    2010年1月19日 12:56
  • 谢谢
    在这里其实Heart是一个webservice,提供一个接口函数 int CommonHeart(); 实体类 Terminal
        class Terminal
        {
            public string name;

            //构造函数
            public Terminal(string name)
            {
                this.name = name;
            }

            //执行动作
            public string DoSomething(int i)
            {
                if (i == 1)
                {
                    return this.name + "DoSomething_one";
                }
                else
                {
                    return this.name + "DoSomething_two";
                }
            }

        }

    我的目的是同时有多个Terminal,每个Terminal 按照心跳时间1秒来访问webservice  Heart的 CommonHeart();把这个CommonHeart()返回的值作为参数执行Terminal自身的
     DoSomething(int i)。
    有什么好的方法能够实现么?

    2010年1月19日 12:56
  • class Terminal
        {
            public string name; 
            //构造函数
            public Terminal(string name)
            {
                this.name = name;
            }
    
            //执行动作
            public string DoSomething(int i)
            {
                if (i == 1)
                {
                    return this.name + "DoSomething_one";
                }
                else
                {
                    return this.name + "DoSomething_two";
                }
            }
    
    public void 多线程调用的方法()
    {
    while(true)
    {
     Thread.Sleep(1000);
    
    DoSomething(CommonHeart()返回的值);
    }
    }
    
        }
    
    

    http://feiyun0112.cnblogs.com/
    2010年1月20日 3:06
    版主
  • 谢谢,能再写的详细点么?
    用你的方法能实现单个Terminal的心跳功能。但是怎么样才能模拟有多个Terminal同时工作呢?就是我要在WinForm中同时有多个Terminal做这样的动作。
    2010年1月20日 13:00
  • 可以使用 Thread 或者 ThreadPool 来模拟多个 Terminal。

    您先写一个 Foo() 方法,方法里面类似于:

    while (true)
    {
       Thread.Sleep(1000);
        int returnValue = heart.CommonHeart();
        Terminal.DoSomething(returnValue);
    }

    然后去 new 几个线程,把它们都 start 即可。

    Thread[] threads = new[] { new Thread(Foo), new Thread(Foo), ... };

    foreach(Thread thread in threads)
    {
        thread.Start();
    }

    至于如何把结果输出到 Form 的 TextBox,则在 Foo 方法中利用 form.Invoke() 方法直接操作 TextBox.Text 属性就可以了。
    Mark Zhou
    2010年1月21日 9:35