【发布时间】:2018-04-02 21:19:00
【问题描述】:
我正在尝试将列表框中的 5 个随机整数数组按升序排序。在创建新线程并单独调用它时,当我选择“排序”按钮时,表单变得无响应。
public partial class Form1 : Form
{
const int iSize = 5;
int[] iArray = new int[iSize];
Random rnd = new Random();
public Form1()
{
InitializeComponent();
}
Thread th;
private void btnGenerate_Click(object sender, EventArgs e)
{
for (int i = 0; i < iArray.Length; i++)
{
iArray[i] = rnd.Next(0, 5);
lbxNumbers.Items.Add(iArray[i]);
}
}
public void threadMethod()
{
bubbleSort(iArray);
foreach(int item in iArray)
{
lbxNumbers.Items.Add(item);
}
}
private void btnSort_Click(object sender, EventArgs e)
{
th = new Thread(threadMethod);
lblStatusUpdate.Text = "Sorting...";
}
private void btnClear_Click(object sender, EventArgs e)
{
lbxNumbers.Items.Clear();
}
public static void bubbleSort(int [] iArray)
{
bool isSorted = false;
int lastUnsorted = iArray.Length - 1;
while(!isSorted)
{
for(int i = 0; i < iArray.Length-1; i++)
{
if(iArray[i] > iArray[i+1])
{
swap(iArray, i, i + 1);
isSorted = false;
}
}
}
}
public static void swap(int [] iArray, int i, int j)
{
int tmp = iArray[i];
iArray[i] = iArray[j];
iArray[j] = tmp;
}
}
我不确定线程实际上在哪里启动。列表框可以立即生成数组并将其清除,但排序使其冻结。我也不确定是否需要在此表单上使用后台工作人员工具。
【问题讨论】:
-
您创建了线程,但我没有看到您启动过它...无论哪种方式,您都遇到了跨线程问题。
-
不要使用线程来更新 UI;使用
async/await。
标签: c# multithreading winforms