У меня есть значительные знания в области программирования, но это первый раз, когда я работаю над многопоточным приложением на C#, поэтому я прошу о помощи в решении моей проблемы.C# управлять потоком из потока пользовательского интерфейса
Во-первых, коды,
public frmCEX()
{
InitializeComponent();
refreshTicker();
}
private void btnRefresh_Click(object sender, EventArgs e)
{
refreshTicker();
}
private void refreshTicker()
{
ssStatus.Text = "Updating ticker..";
btnRefresh.Text = "Updating";
btnRefresh.Enabled = false;
ssUpdated.Text = "Last updated: -";
APIManager apim = new APIManager();
Ticker tk = apim.getTicker();
//blablabla, do some work
ssUpdated.Text = "Last updated: " + DateTime.Now.ToString();
ssStatus.Text = "";
btnRefresh.Text = "Refresh";
btnRefresh.Enabled = true;
}
private void cbxRefresh_CheckedChanged(object sender, EventArgs e)
{
if (cbxRefresh.Checked)
{
Thread thread1 = new Thread(() => BGRefreshThread(Convert.ToInt32(nupRefreshSecs.Value)));
thread1.Start();
}
else
{
// IF REFRESH CHECKBOX IS UNCHECKED, STOP THE THREAD THAT IS REFRESHING
}
}
private void BGRefreshThread(int delay)
{
refreshTicker();
System.Threading.Thread.Sleep(delay * 1000);
}
Моя главная проблема заключается в методе cbxRefresh_CheckedChanged
, в основном, как это работает, является то, что, когда пользователь флажок «Автоматическое обновление» флажок в главном интерфейсе, то CheckedChanged метод создаст новый поток BGRefreshThread
, который запустится в фоновом режиме и обновит тикер, а после того, как флажок снят снова, он завершит поток, который обновит тикер.
Однако у меня возникла проблема с окончанием потока после его запуска, поскольку после завершения метода checkedchanged
поток больше не существует в контексте, когда флажок снят в следующий раз.
Может ли кто-нибудь посоветовать, как я могу заставить это работать? Действительно новое для многопоточного программирования.
** EDIT: Я нашел решение этой проблемы, но прямо сейчас, когда вновь созданный поток пытается вызвать «refreshTicker», который обновляет метки и кнопки на основном пользовательском интерфейсе (который находится в основном потоке) , это дает мне эту ошибку:
Cross-thread operation not valid: Control 'btnRefresh' accessed from a thread other than >the thread it was created on.
любые советы по этому вопросу **
Сохраните thread1 в более широком диапазоне? M Используйте сигнализацию, используйте эту библиотеку задач. –
Вы не можете получить доступ к элементу управления UI из другого потока, кроме потока пользовательского интерфейса, вам нужно использовать 'Control.Invoke' или Dispatcher. См. [Здесь] (http://stackoverflow.com/questions/5037470/cross-thread-operation-not-valid) для получения дополнительной информации –
спасибо! Я изменил «refreshTicker()»; на "this.Invoke ((MethodInvoker) delegate() {refreshTicker();});" но тикер по-прежнему не обновляется, кажется, что поток по какой-то причине не работает. – InnovativeDan