(1)多个线程异步调用同一个静态函数,这个静态函数需要设置线程互斥吗?如果需要,麻烦指点一下比较好的实现方式。(2)我这样控制线程,应该不会无故停止吧?(事实上在调试时曾无故停止过,不知什么原因)
public void RunETV()
{
  while(ETVState)
   {
     //线程的所有动作 
   }
}
ETVState是在主线程中控制的变量。(3)各位谁有异步委托技术的详细资料拜托给我发一份,高分相赠。[email protected]

解决方案 »

  1.   

    http://topic.csdn.net/t/20050802/17/4184140.html
    http://www.autohm.com.cn/development/p401/J40149292.shtml
    http://www.zaoxue.com/article/tech-27554.htm
    http://hi.baidu.com/guanwei/blog/item/ee5001e92b02303cb80e2d22.html
    http://www.cnblogs.com/wenwuxianren/archive/2008/04/17/1158504.html
      

  2.   

    最简单的就是
    在要调用的部分,使用一个lock即可。可查看 MSDN “示例 ”“Visual C# 示例 ” “线程示例”
      

  3.   

    while(ETVState) 
       { 
         //线程的所有动作  
       }
    你这样写肯定不会同步的,因为判断ETVState时不能用指令完成
      

  4.   

    调用同一个静态函数要看函数是否有共享资源的读写,如果只是读就问题不大,如果要写,最好用信号量来锁定资源。
    工作线程的循环最好不要用bool变量或者死循环配合sleep控制,用信号量等待的方式控制
    异步委托可以参考backgroundWorker类
      

  5.   

    MARK 楼上说的有道理
      

  6.   

    (1)多个线程异步调用同一个静态函数,这个静态函数需要设置线程互斥吗?如果需要,麻烦指点一下比较好的实现方式。 
    ==================================
    CLR的静态函数,静态类访问机制,已经保证的它们都是线程安全的,不需要再设置线程同步锁了。。《VIA IN C#》中有这方面的讨论。你看看这个,但愿对你有点帮助
    http://blog.csdn.net/commandos/archive/2008/03/31/2233680.aspx(2)我这样控制线程,应该不会无故停止吧?(事实上在调试时曾无故停止过,不知什么原因) 
    public void RunETV() 

      while(ETVState) 
       { 
         //线程的所有动作  
       } 

    ETVState是在主线程中控制的变量。 
    ==============================================
    无故停止,可能是因为ETVState 被设置为false 
      

  7.   

    可以用lock,或者
      Public Sub addPstWork(ByRef pst As String)
            Dim m As New Mutex
            m.WaitOne()
            Try
                searchPst.renderListBox(pst)
            Finally
                m.ReleaseMutex()
            End Try
        End Sub
      

  8.   

    (2)工作线程的循环最好不要用bool变量或者死循环配合sleep控制,用信号量等待的方式控制  
    麻烦高手给我指点一下信号量的控制方式。
      

  9.   

    给你写一段示范代码吧using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication7
    {
        public partial class Form1 : Form
        {
        
            System.Threading.ManualResetEvent eventObj = new System.Threading.ManualResetEvent(false);
                     private void invokeThread()
            {
                //等待1000ms,如果没有收到终止信号则工作
                while (eventObj.WaitOne(1000,false) == false)
                {
                    Console.WriteLine(Guid.NewGuid());
                }
            }
            public Form1()
            {
                InitializeComponent();
            }
            //开始
            private void button1_Click(object sender, EventArgs e)
            {
                new System.Threading.Thread(new System.Threading.ThreadStart(invokeThread)).Start();
            }
            //停止
            private void button2_Click(object sender, EventArgs e)
            {
                eventObj.Set();
            }
            //退出前停止
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                eventObj.Set();
            }
        }
    }
      

  10.   

    如果这个操作需要进行数据同步的话建议lock否则回死锁的
      

  11.   

    抱歉昨天机子老掉线。
     
      jinjazz :
       
      你的程序看懂且明白,只是疑问这样做的优点在哪儿?比用bool变量配合sleep控制线程的好处在哪儿?请指教。