求指导,问题如下。如下,我设计了一个冒泡排序法的数字排序功能,原本我将算法放在主线程内,代码运行良好。而我在修改后,将算法分别单独装入子线程中,输出结果出现了异常。
我个人认为可能是因为子线程在同时调用主线程的局部变量时出现了冲突,当然也有可能不是这个问题。希望有人能为我指点一下问题所在,在不改变多线程,不改变使用冒泡排序法的前提下指导下该如何解决。
功能:按下“排序”,主线程生成数据,两个子线程分别执行正反排序,并将结果输出在窗体上。
问题:使用子线程排序,输出结果异常。
源码放上:
namespace 数据统计_窗体
{
public partial class From1 : Form
{
public From1()
{
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}
//TimeSpan ts = new TimeSpan();
//int[] a = new int[n];
Thread th = null;
private void From1_Load(object sender, EventArgs e)
{
}
private void buttonList_Click(object sender, EventArgs e)
{
if (th == null)
{
th = new Thread(PaiXu);
th.IsBackground = true;//设置为后台线程
th.Start(); //子线程开始执行方法
}
}
private void buttonExit_Click(object sender, EventArgs e)
{
Close();
}
private void textBoxWrite_KeyPress(object sender, KeyPressEventArgs e)
{
if(((int)e.KeyChar <48||(int)e.KeyChar >57&&(int)e.KeyChar !=8))
{
MessageBox.Show("只能输入整数", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
e.Handled = true;
}
}
private void PaiXu()
{
TimeSpan ts = new TimeSpan();
int n = 0;
//int[] arrayWaitSort = new int[n];
n = int.Parse("0" + this.textBoxWrite.Text);
int[] nums = new int[n]; //数组arr nums用于储存生成的数据
Random rnd = new Random(); //random随机数
for (int i = 0; i < n; i++) //i赋予初值0,只要i小于定义的总容量n,就会一直生成新的随机数
nums[i] = rnd.Next();
foreach (int everynum in nums)
{
this.textBoxNum.Text += everynum + "\r\n";
}
DateTime dt1 = DateTime.Now;
Thread t2 = new Thread(() =>
{
int on = nums.Length;
for (int i = 0; i < on-1 ; i++)
{
for (int j = 0; j < on -1- i; j++)
{
if (nums[j] > nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j+1] = temp;
}
}
}
for (int i = 0; i < nums.Length; i++)
this.textBoxListON.Text += nums[i] + "\r\n";
});
Thread t3 = new Thread(() =>
{
int otto = nums.Length - 1;
for (int h = 0; h < otto; h++)
{
for (int k = 0; k < otto - h; k++)
{
if (nums[k + 1] > nums[k])
{
int max = nums[k];
nums[k] = nums[k + 1];
nums[k + 1] = max;
}
}
}
for (int h = 0; h < n; h++)
this.textBoxListOut.Text += nums[h] + "\r\n";
});
t2.Start();
t3.Start();
if(th.IsAlive)
{
DateTime dt2 = DateTime.Now;
ts = dt2 - dt1;
this.textBoxTime.Text = Convert.ToString(ts);
}
}
}
}
界面如下:
接下来是调试效果:(排序结果输出异常)