Считывание значения из другого потока.

#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; }));