在c#中使用windows线程
本文关键字:windows 线程 | 更新日期: 2023-09-27 18:12:59
我想在我的windows窗体的几个函数中使用线程。
我有一个按钮,将添加和检查输入是否正确超过4k项顺序到我的表单中的listview,但表单冻结,直到其执行函数,然后所有的项目一次显示。我想知道我怎么能看到项目被添加一个接一个使用线程没有形式冻结。我读了关于线程和后台工作(https://msdn.microsoft.com/pt-br/library/ms171728(v=VS.110).aspx),但我不明白它很好如何链接一个函数与后台工作,或者如何安全地调用线程(与委托部分混淆)。我怎么能让它调用一个函数后线程完成?
This is what I'm trying but its giving "InvalidOperationException" at 2 places:
- when I try to add the item to my listView at
"lissView1.Items.Add(tempItem)" in the of "bw1_DoWork" loop.
- When I try "String temp = ..." inside the "Parallel.For":
namespace WindowsFormsApplication2
{
public partial class mainForm : Form
{
private BackgroundWorker bw1;
public mainForm()
{
InitializeComponent();
formLoad();
bw1 = new BackgroundWorker();
bw1.DoWork += bw1_DoWork;
}
private void pasteButton_Click(object sender, EventArgs e)
{
bw1.RunWorkerAsync(Clipboard.GetText());
}
private void bw1_DoWork(object sender, DoWorkEventArgs e){
String temp = "";
int n;
ListViewItem.ListViewSubItem tempSubItem;
ListViewItem tempItem;
String cp =(String) e.Argument;
string[] stringSeparators = new string[] { "'r'n" };
string[] rows = cp.Split(stringSeparators, StringSplitOptions.None);
for (int i = 0; i < rows.Length-1; i++)
{
tempItem = new ListViewItem(rows[i].Split(''t'));
tempItem.UseItemStyleForSubItems = false;
tempSubItem = new ListViewItem.ListViewSubItem();
tempSubItem.BackColor = Color.Green;
tempSubItem.Text = "NORMAL";
temp = String.Format("{0}''{1}", TextBox0.Text, tempItem.SubItems[1].Text);
if (!File.Exists(temp))
{
tempItem.SubItems[1].BackColor = Color.Red;
tempSubItem.BackColor = Color.Red;
tempSubItem.Text = "ERRO";
}
temp = String.Format("{0}''{1}", TextBox1.Text, tempItem.SubItems[2].Text);
if (!File.Exists(temp))
{
tempItem.SubItems[2].BackColor = Color.Red;
tempSubItem.BackColor = Color.Red;
tempSubItem.Text = "ERRO";
}
if (int.TryParse(tempItem.SubItems[0].Text, out n))
{
if (n > networkList.Items.Count)
{
tempItem.SubItems[0].BackColor = Color.Red;
tempSubItem.BackColor = Color.Red;
tempSubItem.Text = "ERRO";
}
}
else
{
tempItem.SubItems[0].BackColor = Color.Red;
tempSubItem.BackColor = Color.Red;
tempSubItem.Text = "ERRO";
}
try
{
tempItem.SubItems[4] = tempSubItem;
}
catch (ArgumentOutOfRangeException)
{
tempItem.SubItems.Add(tempSubItem);
}
lissView1.Items.Add(tempItem);
}
}
private void interactiveRunButton_Click(object sender, EventArgs e)
{
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;
Parallel.For(0, inputList.Items.Count,
index =>
{
testex(String.Format("{0};{1};{2};{3}", listView1.Items[index].SubItems[0].Text, listView1.Items[index].SubItems[1].Text, listView1.Items[index].SubItems[2].Text, listView1.Items[index].SubItems[3].Text));
});
}
static void testex(string f)
{
Process compiler = new Process();
compiler.StartInfo.FileName = "testex.exe";
compiler.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
compiler.StartInfo.Arguments =f;
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();
Console.WriteLine(compiler.StandardOutput.ReadToEnd());
}
}
}
如果你想让你的UI响应,你需要使用BackgroundWorker。这里有关于它的文档http://www.albahari.com/threading/part3.aspx#_BackgroundWorker
另一个问题是我想通过调用多个线程来更快地执行一个函数,这个函数不需要按顺序排列。它也来自一个按钮:
然后你可以再次使用并行库。平行的。每一种方法都将有助于实现你的目标。这里有相同的链接http://www.albahari.com/threading/part5.aspx#_Parallel.For_and_Parallel.ForEach
要隐藏控制台窗口,请查看以下可能的副本:
。Net Console应用程序不能弹出控制台
对于线程,你需要控制线程的数量,以避免淹没你的机器。考虑使用线程池
如果你使用的是。net 4.0+, PLinQ将通过并行的for循环优雅地完成这项工作。选择这里。