I would like to use thread in a few functions in my windows form.
I have a button that would add and check if the input was correct over 4k items in order to the listview in my form, but the form freezes until its over executing the function and then all the items show up at once. I would like to know how can I see the items being added one by one using threads without the form freezing.I read about threads and background worker(https://msdn.microsoft.com/pt-br/library/ms171728(v=VS.110).aspx) but I didnt understand it very well how to link a function with the background worker,or how to call the thread safely(got confused with delegate part). And how can I make it call a function after the thread is done?
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());
}
}
}