public void Sort()
{
try
{
while(true)
{
swaped = false;
for (int j = 0; j<valueArray.Length-1; j++)
{
lock(typeof(Thread))
{
if(valueArray[j] > valueArray[j+1])
{
int T = valueArray[j];
valueArray[j] = valueArray[j+1];
valueArray[j+1] = T;
swaped = true;
}
}
}
Thread.Sleep(1);
if(!swaped)
{
break;
}
}
Thread.CurrentThread.Abort();
}
catch(Exception ex)
{
if( Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadNum.SelectedItem.Text.ToString().Trim()))
Display();
}
}
这个函数是多线程用来做冒泡算法的
有个问题,就是为什么这里要用try catch呢
还有 Interlocked.Increment(ref threadCounter)
这个是什么用法 有什么意义啊?
{
try
{
while(true)
{
swaped = false;
for (int j = 0; j<valueArray.Length-1; j++)
{
lock(typeof(Thread))
{
if(valueArray[j] > valueArray[j+1])
{
int T = valueArray[j];
valueArray[j] = valueArray[j+1];
valueArray[j+1] = T;
swaped = true;
}
}
}
Thread.Sleep(1);
if(!swaped)
{
break;
}
}
Thread.CurrentThread.Abort();
}
catch(Exception ex)
{
if( Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadNum.SelectedItem.Text.ToString().Trim()))
Display();
}
}
这个函数是多线程用来做冒泡算法的
有个问题,就是为什么这里要用try catch呢
还有 Interlocked.Increment(ref threadCounter)
这个是什么用法 有什么意义啊?
try尝试执行,如果遇到错误则抛出异常 ,catch 获取异常信息
可以用这个来使程序更加的健壮后面的...本人水平有限...
try/catch 主要是防止Thread.CurrentThread.Abort();出错的吧.
为什么Thread.CurrentThread.Abort()会引发TreadAbortException 啊?
看MSDN:
When this method is invoked on a thread, the system throws a ThreadAbortException in the thread to abort it.
当你调用Thread::Abort()的时候,ThreadAbortException就会被抛出。
不过这个Exception不一定要接, 因为就算你在你的catch里接了, 它也一样会在你的catch里被抛出的。
除非你在你的catch{}里Invoke Thread::ResetAbort();
我看了一下你上面的代码, 其实你不需要调用:Thread.CurrentThread.Abort(); 这显得有些多余了。。
你可以改为:
public void Sort()
{
while (true)
{
swaped = false;
for (int j = 0; j < valueArray.Length - 1; j++)
{
lock (typeof(Thread))
{
if (valueArray[j] > valueArray[j + 1])
{
int T = valueArray[j];
valueArray[j] = valueArray[j + 1];
valueArray[j + 1] = T;
swaped = true;
}
}
}
Thread.Sleep(1);
if (!swaped)
{
break;
}
}
//当你跳出你的 dead while loop的时候,其实你的Thread已经要完成了。
//当你的Thread里的代码运行完毕的时候你的Thread就会自动消失, 无需使用Abort();
//除非你的这个Sort()方法是在别的Thread里调用了, 那么使用Abort()就有必要了。
if (Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadNum.SelectedItem.Text.ToString().Trim()))
Display(); }
//=======================
Interlocked.Increment(int value);
这个方法保证了Thread Safe增加一个int数值。在多Thread并发的情况下, 你可以使用这个方法.