#c# #.net #multithreading
#c# #.net #многопоточность
Вопрос:
Я создал поток. Как я могу прочитать значения переменных из потока GUI?
Я знаю, как их изменить. Я не знаю, как их прочитать.
Это то, что я использую для изменения параметров в потоке GUI:
public void Log(string message)
{
MethodInvoker m = () => { Log_textBox.Text = message; };
if (InvokeRequired)
{
BeginInvoke(m);
}
else
{
Invoke(m);
}
}
Мне нужно прочитать некоторые значения из потока GUI:
public void StartBot()
{
Klient.StartBot(selectedType, (int)nb_count.Value, nb_nonstop.Checked, (...)int.Parse(extra_set.SelectedItem.ToString()));
}
private void StartStopButton_Click(object sender, EventArgs e)
{
Thread questThread = new Thread(StartBot);
Klient.RequestToStop = false;
questThread.Start();
}
Я получаю ошибку при работе с перекрестным потоком в строке с Клиентом.Список аргументов StartBot (…).
Как это исправить?
Комментарии:
1. Если вы используете .NET 4.0 (vs 2010), то есть много нового материала об асинхронности, который должен охватывать то, что вы ищете wischik.com/lu/AsyncSilverlight/AsyncSamples.html
2. Если
InvokeRequired
равно false , вам не нужно вызыватьInvoke
. Вы можете просто вызватьm();
.3. @Cos: Нет; это C # 5 CTP, и не очень актуально.
Ответ №1:
Вы можете вернуть значение из вызванного делегата, создав Func<ReturnType>
.
Invoke
вернет возвращаемое значение функции.
В качестве альтернативы, вы можете установить локальную переменную внутри делегата и вызвать ее с помощью Invoke
(не BeginInvoke
, поскольку это не будет ждать его завершения)
Комментарии:
1.
var result = (int)Invoke(new Func<int>(delegate { return 7; }));