>>>Counter = Counter - 1;如果是多线程的话,你应该用System.Threading.Interlocked.Decrement(ref Counter);>>testdelegate.BeginInvoke(bb.ToString().Trim(),null,null);use a callback, seeWorking with callbacks and delegates in C# 
http://msdn.microsoft.com/vcsharp/downloads/samples/23samples/default.aspx

解决方案 »

  1.   

    saucer(思归) ( ) 信誉:326   老大
    System.Threading.Interlocked.Decrement(ref Counter);
    上面这个不好使呀>>testdelegate.BeginInvoke(bb.ToString().Trim(),null,null);for(int i=0;i<aa.Count;i++)
    {
    TestDelegate testdelegate = new TestDelegate(TestIfTrue);
    testdelegate.BeginInvoke(bb.ToString().Trim(),null,null);
    Thread.Sleep(0);
    }
    还有这个问题,同一个方法异步执行了100000000000000000次,怎么知道都执行完了,
      

  2.   

    这个问题我要说得在明白一些才行
    for(int i=0;i<aa.Count;i++)//////用这个偱环给这个委托所代理的方法传参数
    {
            TestDelegate testdelegate = new TestDelegate(TestIfTrue);
    testdelegate.BeginInvoke(aa.ToString().Trim(),null,null);
    Thread.Sleep(0);//////////这样就能使调用的“aa.Count个委托异步执行“,这个委托所代理的方法中我加了一个类是计数器的变量Counter,执行一次这个委托所代理的方法就让它减1.现在这个Counter不准如如:200 200 200 197 196 ......100 100 98。。
    (Interlocked.Decrement()这个方法也不准)“aa.Count个委托异步执行“在系统线程池中开了32个线程来执行。怎么才能做到一个线程执行委托所代理的方法5秒钟,然后把这个线程abort停了。???????????????
    }
      

  3.   

    >>>System.Threading.Interlocked.Decrement(ref Counter);
    >>>上面这个不好使呀不好使是什么意思?>>>>这个变量记得数有时不准,比如有时是出现两个100或三个200在Counter=Counter-1与你输出Counter之间有什么执行语句么?把其他编码贴出来吧using System;
    using System.Threading;
    class TestAsync
    {
      int Counter;  delegate void TestDelegate (string cc);  void Test_GoTo(int n)
      {
            Counter = n;
    for(int i=0;i<n;i++)
    {
    string bb = i.ToString(); TestDelegate testdelegate = new TestDelegate(TestIfTrue);
    AsyncCallback cb = new AsyncCallback(AsyncCallbackMethod);
    testdelegate.BeginInvoke(bb.ToString().Trim(),cb,null);
    Thread.Sleep(0);
    }
      }
      private void AsyncCallbackMethod(IAsyncResult ar)
      {
    //Counter = Counter - 1;
    //int n = Counter; //System.Threading.Interlocked.Decrement(ref Counter); int n = System.Threading.Interlocked.Decrement(ref Counter);
    if (n==0)
    {
    Console.WriteLine("done");
    }
      }  public void TestIfTrue(string cc)
      {
    Thread.Sleep(new Random().Next(1000));
    //Counter = Counter - 1;
    //System.Threading.Interlocked.Decrement(ref Counter);
    Console.WriteLine(Counter);
      }
     
      static void Main()
      {
    TestAsync ta = new TestAsync();
    ta.Test_GoTo(200);
    Console.ReadLine();
      }
    }
      

  4.   

    saucer(思归) 老大可能是这个地方误导了你
    Counter = aa.Count
    for(int i=0;i<aa.Count;i++)
    {
    ,...........
           testdelegate.BeginInvoke(aa[i].ToString().Trim(),null,null);
    ..............
    }
    第一个参数是这个aa[i].ToString().Trim()
    不是aa.ToString().Trim()
    我写错了,对不起,太急了
      

  5.   

    这应该是无关紧要的吧,多个线程访问同一个变量的话,你需要用lock或用我上面这个方法
      

  6.   

    在Counter=Counter-1与你输出Counter之间有什么执行语句么?没有。
    可能是
    Interlocked.Decrement(ref Counter);
    ------------------------------------------------->在这两语句之间有别的线程进入了
    Note.Items.add(Counter)-----------所以它显示的就有时出现两个100或三个200
      

  7.   

    我要准确的判断出为0后在做出一次偱环,但异步操作的时候有狠多线程来操作这个Counter,有可能第一个线程Interlocked.Decrement(ref Counter)执行后,时间片没了,第一个线程来了它又Interlocked.Decrement(ref Counter)了一下,这时这个Counter为0了,程序里判断Counter为0后做出一次偱环,等第一个线程得到时间片在执行的时候,Counter为0,它又做出一次偱环怎么样才能避免这种情况发生??????????????谢谢老大了先
      

  8.   

    写错了,重发一次
    我要准确的判断出为Counter为0后在做出一次偱环,但异步操作的时候有狠多线程来操作这个Counter,有可能第一个线程Interlocked.Decrement(ref Counter)执行后,时间片没了,第二个线程来了它又Interlocked.Decrement(ref Counter)了一下,这时这个Counter为0了,程序里判断Counter为0后做出一次偱环,等第一个线程得到时间片在执行的时候,Counter为0,它又做出一次偱环怎么样才能避免这种情况发生??????????????谢谢老大了先
      

  9.   

    tryNote.Items.add(Interlocked.Decrement(ref Counter));
      

  10.   

    或者int n = Interlocked.Decrement(ref Counter);.....Note.Items.add(n);
      

  11.   

    saucer(思归)老大,您来帮助我,我有些激动,总写错,是不是有些肉麻。哈哈哈哈。在Counter=Counter-1与你输出Counter之间有什么执行语句么?
    没有。是这样的
    Interlocked.Decrement(ref Counter);
    ------------------------------------------------->可能是在这两语句之间有别的线程进入了
    if(Counter==0)-----------我要准确的判断出为Counter为0后在做出一次偱环,但异步操作的时候有狠多线程来操作这个Counter,有可能第一个线程Interlocked.Decrement(ref Counter)执行后,时间片没了,第二个线程来了它又Interlocked.Decrement(ref Counter)了一下,这时这个Counter为0了,程序里判断Counter为0后做出一次偱环,等第一个线程得到时间片在执行的时候,Counter为0,它又做出一次偱环怎么样才能避免这种情况发生??????????????谢谢老大了先
      

  12.   

    don't use Counter = Counter   - 1;
    int n = Interlocked.Decrement(ref Counter);.....if (n==0)
    {
     //.....do your clean up here
    }
      

  13.   

    don't use Counter = Counter   - 1;
    早就不用这个了。。
    int n = Interlocked.Decrement(ref Counter);
    ---------------------------------------------比如这里要写数据库,费些时间。
    if (n==0)-----这就不能准了。
    {
     //.....do your clean up here
    }
      

  14.   

    先用我下面的代码试试
    ///////////////////////////////////////////
    using System;
    using System.IO;
    using System.Threading;
    namespace 异步
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    { private delegate  void TestDelegate(string state); private static ManualResetEvent alldown=new ManualResetEvent(false);
      static int  Counter = 0;///////////////////////////请帮忙注意一下这个变量 [STAThread]
    static void Main(string[] args)
    {
    alldown.Reset(); Test_GoTo();
    }
    private static void Test_GoTo()
    {
    Counter = 100;
     
    for(int i=0;i<100;i++)
    {
    Console.WriteLine("i:"+i.ToString());
    TestDelegate testdelegate = new TestDelegate(TestIfTrue);
     
    testdelegate.BeginInvoke("test",null,null);
    alldown.WaitOne(); }
    }
    public  static void TestIfTrue(string cc)
    {
    System.Threading.Interlocked.Decrement(ref Counter); Console.WriteLine("counter:"+Counter);
    alldown.Set();
    } }
    }
    ////////////////////////////////////////////////////////////////////////////////
    我还是没有完全理解你的意图,如果“在测试的过程中总有这么一两地址测试不通然后Counter就停在了哪里不动”这时想结束异步方法,我觉得你还是用线程比较好处理,自建一个线程队列,任务完成的自动结束,所谓ping的不通,用超时机制结束此线程
      

  15.   

    是这样的,下面这个事件开始一个Test_GoTo();private void Test_button_Click(object sender, System.EventArgs e)
    {
             .............
    Test_GoTo();
    }
    int testcountmax = 0;这个变量记录Test_GoTo()方法执行了多少次
    int Counter = 0;////这个变量记录TestIfTrue方法在这次事件中执行了多少次private void Test_GoTo()
    {
             Counter = aa.Count;
             ...........
    for(int i=0;i<aa.Count;i++)
    {
    TestDelegate testdelegate = new TestDelegate(TestIfTrue);
    testdelegate.BeginInvoke(bb.ToString().Trim(),null,null);
    Thread.Sleep(0);
    }
    }
    public void TestIfTrue(string cc)
    {
    Interlocked.Decrement(ref SendCounter);      
             ----------->>>>>>>这里有网络测试,是否成功写数据库。
    这句不能放这(Interlocked.Decrement(ref SendCounter);)有时上面的测试死掉      
    if( SendCounter == 0 )///SendCounter有时不准,如:200 200 200 197....100 100 98
    {
    TestCounter = TestCounter + 1;
    Note.Items.Add("<-------------------------------->"); 
    Note.Items.Add("已经完成" + TestCounter + "次测试"); 
      if(TestCounter<testcountmax)
    {
    Test_GoTo();
    }
    else
    {
    DateTime en = DateTime.Now;
    TimeSpan span = new TimeSpan();
    span = en - be;
    MessageBox.Show("测试已经结束,共用时" + span.ToString());
    }
    }
      

  16.   

    是这样的,下面这个事件开始一个Test_GoTo();private void Test_button_Click(object sender, System.EventArgs e)
    {
             .............
    Test_GoTo();
    }
    int testcountmax = 0;这个变量记录Test_GoTo()方法执行了多少次
    int Counter = 0;////这个变量记录TestIfTrue方法在这次事件中执行了多少次private void Test_GoTo()
    {
             Counter = aa.Count;
             ...........
    for(int i=0;i<aa.Count;i++)
    {
    TestDelegate testdelegate = new TestDelegate(TestIfTrue);
    testdelegate.BeginInvoke(aa[i].ToString().Trim(),null,null);
    Thread.Sleep(0);
    }
    }
    public void TestIfTrue(string cc)
    {
    Interlocked.Decrement(ref SendCounter);      
             ----------->>>>>>>这里有网络测试,是否成功写数据库。
    这句不能放这(Interlocked.Decrement(ref SendCounter);)有时上面的测试死掉      
    if( SendCounter == 0 )///SendCounter有时不准,如:200 200 200 197....100 100 98
    {
    TestCounter = TestCounter + 1;
    Note.Items.Add("<-------------------------------->"); 
    Note.Items.Add("已经完成" + TestCounter + "次测试"); 
      if(TestCounter<testcountmax)
    {
    Test_GoTo();
    }
    else
    {
    DateTime en = DateTime.Now;
    TimeSpan span = new TimeSpan();
    span = en - be;
    MessageBox.Show("测试已经结束,共用时" + span.ToString());
    }
    }
      

  17.   

    多谢saucer ,问题解决了,你回的贴子有个地方当时没在意思,其实是狠重要的。谢谢其它兄弟,多谢了