может кто-нибудь помочь мне, как установить метод Thread.join() в моем классе или если есть аккуратный способ работы с классом SynchronizationContext
и thread.join
. в основном, я пытаюсь обновить ячейку datagridview (dgv) и индикатор выполнения (pb) каждые 2 секунды из другого потока (а не потока пользовательского интерфейса). функциональность отлично работает, когда один поток выполняет задание; однако я хотел бы установить 2 потока, чтобы первый поток (Thread 1) обновил элементы управления (в моем случае он обновит datagridview и отобразит 10 строк, а индикатор выполнения будет обновлен до 50%). как только поток 1 выполнит свою работу, Thread 2 должен запустить и обновить элементы управления (в моем случае он обновит datagridview и отобразит еще 10 строк, а индикатор выполнения будет обновлен до 100%). См. Код ниже.Поперечное взаимодействие C#
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace DelegatesAndCallback
{
public partial class Form1 : Form
{
private Thread newThread1;
private Thread newThread2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int id = Thread.CurrentThread.ManagedThreadId;
Trace.WriteLine("Button thread "+id);
SynchronizationContext uiContext = SynchronizationContext.Current;
// thread #1
startThread1(uiContext);
// thread #2
startThread2(uiContext);
}
public void startThread1(SynchronizationContext sc)
{
// thread #1
newThread1 = new Thread(Process1) { Name = "Thread 1" };
newThread1.Start(sc);
//newThread1.Join();
}
public void startThread2(SynchronizationContext sc)
{
// thread #2
newThread2 = new Thread(Process2) { Name = "Thread 2" };
newThread2.Start(sc);
//newThread2.Join();
}
public void updateProgressBarValue(object state)
{
double val = Convert.ToDouble(state)/19.0;
pb.Value = (int)(100*val);
}
public void updateDataGridViewValue(object state)
{
dgv.Rows.Add((int) state, (int) state);
}
public void Process1(object state)
{
SynchronizationContext uiContext = state as SynchronizationContext;
for (int i = 0; i < 10; i++)
{
uiContext.Send(updateDataGridViewValue, i);
uiContext.Send(updateProgressBarValue, i);
Thread.Sleep(2000);
}
}
public void Process2(object state)
{
SynchronizationContext uiContext = state as SynchronizationContext;
for (int i = 10; i < 20; i++)
{
if (uiContext != null) uiContext.Send(updateProgressBarValue, i);
if (uiContext != null) uiContext.Send(updateDataGridViewValue, i);
Thread.Sleep(2000);
}
}
}
}
Что именно вы с просьбой помочь с? Какие проблемы возникают при использовании thread.join? Зачем вам два потока? Можете ли вы начать второй поток с первого? – Chris
@ Крис, ты прав Крис, если я добавлю второй поток в первый, он будет работать. Тем не менее, я пытаюсь использовать метод thread.join таким образом, что, как только первый поток заканчивает свое задание, второй поток начинает свою работу. –
Проблема в том, что thread.join Я считаю, что останавливает выполнение текущего потока, ожидая окончания другого потока. Таким образом, в вашем примере, если вы раскомментировали '.Join()' s, вы бы не сильно отличались от того, чтобы просто делать это в одном потоке (есть некоторые различия, но не в плане простого потока программы). – Chris