Известно, что метод Invoke используется, когда вам необходимо обновить gui из другого потока. Но как я могу реализовать это без привязки к коду?Обновление GUI из потока C#, без привязки к элементам управления пользовательского интерфейса
Вот мой тестовый класс:
class test
{
public List<Thread> threads = new List<Thread>();
public int nThreads = 0;
public int maxThreads = 5;
public void DoWork(object data)
{
string message = (string)data;
//MessageBox.Show(message);
}
public void CreateThread(object data)
{
if (nThreads >= maxThreads)
return;
Thread newThread = new Thread(DoWork);
threads.Add(newThread);
newThread.IsBackground = true;
newThread.Start(data);
nThreads++;
}
public void WindUpThreads()
{
//MessageBox.Show("count: " + nThreads.ToString());
for(int i = 0; i < threads.Count; i++)
{
if (threads[i].IsAlive == false)
{
threads[i].Abort();
threads.RemoveAt(i);
//MessageBox.Show("removing at " + i.ToString());
}
}
nThreads = threads.Count;
}
}
Вопрос заключается в том, что = tecnique я должен использовать для того, чтобы обновить графический интерфейс, но не жёстко контроль в классе? Я попытался передать делегата методу DoWork, но это не работает (http://pastebin.com/VaSYFxPw). Благодаря!
Я использую WinForms, .NET 3.5
Вот обработчик button_click:
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
test thTest = new test();
string[] strings;
try
{
strings = File.ReadAllLines("C:\\users\\alex\\desktop\\test.txt");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
bool flag = true;
int counter = 0;
int dataCount = strings.Length;
while (flag == true)
{
if (counter >= dataCount)
{
flag = false;
}
while (thTest.nThreads < thTest.maxThreads)
{
if (flag == false)
break;
thTest.CreateThread(strings[counter]);
//Data d = new Data();
//d.deleg = AddItem;
//d.mess = strings[counter];
//thTest.CreateThread((object)d);
//MessageBox.Show(counter.ToString());
counter++;
}
thTest.WindUpThreads();
if (flag == false)
{
do
{
thTest.WindUpThreads();
} while (thTest.nThreads != 0);
}
}
listBox1.Items.Add("Done");
}
Идея заключается в том, что I'am запуск потоков для каждой задачи, я хочу, чтобы обработать. После того, как я проверю, есть ли завершенные задачи, затем они завершаются, и новые запускаются, пока не осталось больше задач.
Каждый список <> имеет свойство .Count, вы можете использовать его вместо nThreads. В цикле for вы удаляете элементы из списка. Это может быть проблематично. Представьте список из 2 предметов. Цикл начинается с i = 0, а затем удаляет 0-й элемент. Теперь список имеет только 1 элемент, и когда он пытается получить доступ к списку [1], он не сработает. –
Какую структуру вы используете? WinForms? WPF? ...? –
@DennisKuypers, но я уже использую .Count. Или ты, что ты имеешь в виду? –