>>>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
http://msdn.microsoft.com/vcsharp/downloads/samples/23samples/default.aspx
解决方案 »
- win7客户端读取数据慢,XP客户端速度很快,帮我看一下原因
- VS2008环境字体太小怎么调(*请注意是环境字体,不是代码字体)?
- c#新手问题
- 调查:在学习C#过程中遇到的难题是什么?
- 字符串输入问题
- 如何通过SQL的Object来验证SQL的语法是否正确?
- 编译ActivexDLL类型为何一定要选为Com Interop 注册? 这个生成项目的选项是什么意思呢??
- 一个XmlDocument怎么样转换成XmlNode[] ?
- c#读取网页,如果报错需要记录,用什么方式好?
- C# 中想用一个控件,可以完成网页的功能。显示的内容为客户输入的内容可能是文本、图片等
- 在RichTextBox中选择文本怎么不灵活啊?总是选择多个字符.
- 请教高手,可不可以在c#里面调用c写的.obj
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次,怎么知道都执行完了,
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停了。???????????????
}
>>>上面这个不好使呀不好使是什么意思?>>>>这个变量记得数有时不准,比如有时是出现两个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();
}
}
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()
我写错了,对不起,太急了
可能是
Interlocked.Decrement(ref Counter);
------------------------------------------------->在这两语句之间有别的线程进入了
Note.Items.add(Counter)-----------所以它显示的就有时出现两个100或三个200
我要准确的判断出为Counter为0后在做出一次偱环,但异步操作的时候有狠多线程来操作这个Counter,有可能第一个线程Interlocked.Decrement(ref Counter)执行后,时间片没了,第二个线程来了它又Interlocked.Decrement(ref Counter)了一下,这时这个Counter为0了,程序里判断Counter为0后做出一次偱环,等第一个线程得到时间片在执行的时候,Counter为0,它又做出一次偱环怎么样才能避免这种情况发生??????????????谢谢老大了先
没有。是这样的
Interlocked.Decrement(ref Counter);
------------------------------------------------->可能是在这两语句之间有别的线程进入了
if(Counter==0)-----------我要准确的判断出为Counter为0后在做出一次偱环,但异步操作的时候有狠多线程来操作这个Counter,有可能第一个线程Interlocked.Decrement(ref Counter)执行后,时间片没了,第二个线程来了它又Interlocked.Decrement(ref Counter)了一下,这时这个Counter为0了,程序里判断Counter为0后做出一次偱环,等第一个线程得到时间片在执行的时候,Counter为0,它又做出一次偱环怎么样才能避免这种情况发生??????????????谢谢老大了先
int n = Interlocked.Decrement(ref Counter);.....if (n==0)
{
//.....do your clean up here
}
早就不用这个了。。
int n = Interlocked.Decrement(ref Counter);
---------------------------------------------比如这里要写数据库,费些时间。
if (n==0)-----这就不能准了。
{
//.....do your clean up here
}
///////////////////////////////////////////
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的不通,用超时机制结束此线程
{
.............
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());
}
}
{
.............
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());
}
}