Задать вопрос

Как передать изменить параметр контрола из внешнего класса в потоке в C# 4.0?

Есть форма Form1 и отдельный класс метод которого исполняется в thread.

Form1.cs:
<font color="black"><ol>
<li><font color="#008000">// ...</font></li>
<li><font color="#0000ff">private</font> <font color="#0000ff">void</font> Start_Click(<font color="#0000ff">object</font> sender, <font color="#2B91AF">EventArgs</font> e)</li>
<li>{</li>
<li> <font color="#008000">// ...</font></li>
<li> <font color="#0000ff">var</font> parse = <font color="#0000ff">new</font> Parse</li>
<li> {</li>
<li>&nbsp; param = 45</li>
<li> };</li>
<li> <font color="#0000ff">var</font> t = <font color="#0000ff">new</font> Thread(parse.WriteToBase);</li>
<li> t.Start();</li>
<li>}</li>
<li><font color="#008000">// ...</font></li>
<li><font color="#0000ff">delegate</font> <font color="#0000ff">void</font> SetTextCallback(<font color="#0000ff">string</font> text);</li>
<li><font color="#0000ff">public</font> <font color="#0000ff">void</font> AppendText(<font color="#0000ff">string</font> text)</li>
<li>{</li>
<li> <font color="#0000ff">if</font> (log.InvokeRequired)</li>
<li> {</li>
<li>&nbsp; <font color="#0000ff">var</font> d = <font color="#0000ff">new</font> SetTextCallback(AppendText);</li>
<li>&nbsp; Invoke(d, <font color="#0000ff">new</font> <font color="#0000ff">object</font>[] { text });</li>
<li> }</li>
<li> <font color="#0000ff">else</font></li>
<li> {</li>
<li>&nbsp; log.Text = text;</li>
<li> }</li>
<li>}</li>
<li>// ...</li>
</ol></font><font color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font color="gray">Source Code Highlighter</font></a>.</font>


Parse.cs
<font color="black"><ol>
<li><font color="#008000">// ...</font></li>
<li><font color="#0000ff">class</font> Parse</li>
<li>{</li>
<li> <font color="#0000ff">public</font> <font color="#0000ff">int</font> xx;</li>
<li>&nbsp;</li>
<li> <font color="#0000ff">public</font> <font color="#0000ff">void</font> WriteToBase()</li>
<li> {</li>
<li>Form1.AppendText(<font color="#A31515">&quot;Test\n&quot;</font>);</li>
<li> }</li>
<li>}</li>
<li>// ...</li>
</ol></font><font color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font color="gray">Source Code Highlighter</font></a>.</font>



Form1.AppendText(); — вот на это ругается — «non-static method in static context», разумеется если этот метод делаю статическим Invoke не работает.


В общем мне нужно передать любыми путями из этого метода в TextBox на форме во время исполнения метода. Выносить цикл из метода в класс Form1 не выход.


Опыта мало, и поиск ничего не дает. Передавать из класса данные, это же очевидно нужно, подскажите как не лепить велосипедов? Спасибо!
  • Вопрос задан
  • 4475 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
equand прав. До конца может не понимаю, что конкретно требуется, написал небольшой пример и с него должно, в принципе, быть понятно как в потоке запустить метод и вызывать другой из Form1.cs

Form1.cs:
public Form1()
{
  InitializeComponent();
  var counter = new Counter(Log);    
  var thread = new Thread(counter.Start);
  thread.Start();
}

public void Log(int a)
{
  if (InvokeRequired)
  {
    Invoke(new MethodInvoker(() => Log(a)));
    return;
  }
  Text = a.ToString();
}


* This source code was highlighted with Source Code Highlighter.


Counter.cs:
public class Counter
{
  private readonly Action<int> _logger;

  public Counter(Action<int> logger)
  {
    _logger = logger;
  }

  public void Start()
  {
    for(var i =0;;i++)
    {
      _logger(i);
      Thread.Sleep(1000);
    }
  }
}


* This source code was highlighted with Source Code Highlighter.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@equand
разве ему не instance нужен? Вы же метод статически вызываете, а ему нужен уже инициализированный объект
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы