据我了解,您是多任务处理的新手。我希望我的案例研究对你有所帮助。创建一个带有下一个控件的窗体:
-
startButton, stopButton 作为按钮
-
minTextEdit, maxTextEdit 作为文本编辑
-
listListView 作为列表视图
对于 startButton 和 stopButton 使用适当的方法:startButton_Click 和 stopButton_Click。
填写下面的代码:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Thread0
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private static readonly Random _random = new Random();
private List<int> lst = new List<int>();
private bool isRun = false;
private void startButton_Click(object sender, EventArgs e)
{
isRun = true;
stopButton.Enabled = true;
startButton.Enabled = false;
var tskMain = Task.Run(() =>
{
for (int i = 0; i < 8; i++)
{
var tsk1 = Task.Run(() =>
{
while (true)
{
int max = 0;
int min = Int32.MaxValue;
lock (lst)
{
int num = _random.Next(1, 1000000);
lst.Add(num);
foreach (var x in lst)
{
if (x > max) max = x;
if (min > x) min = x;
}
listListView.BeginInvoke(new Action(() => listListView.Items.Insert(0, num.ToString())));
}
maxTextBox.BeginInvoke(new Action(() => maxTextBox.Text = max.ToString()));
minTextBox.BeginInvoke(new Action(() => minTextBox.Text = min.ToString()));
if (!isRun) break;
Thread.Sleep(100);
}
});
}
});
}
private void stopButton_Click(object sender, EventArgs e)
{
isRun = false;
stopButton.Enabled = false;
startButton.Enabled = true;
}
}
}
当您单击“开始”按钮时,流会创建并运行tskMain 线程,这会再创建 8 个线程。在它们中的每一个中,将一个整数添加到值列表lst,并搜索最大值和最小值。 listListView也加上了新的数字,最大值和最小值在对应的minTextEdit和maxTextEdit中。
在工作中使用 lambda 表达式很方便。
lock(lst) ... 块使用值列表。一次一个动作,所以没有例外。
BeginInvoke 方法允许您从线程调用主表单流中的表单元素的方法。 Action 用于将 lambda 表达式“转换”为委托方法。
在每个线程内部,检查变量IsRun,如果其值为false,则线程执行停止。
好吧,为了确保一切都不会很快使用.Sleep