Добавьте в свой проект след. класс:
using System;
using System.Windows.Forms;
namespace Tools
{
public static class InvokeHelper
{
public static void SafeInvoke(this Control control, Action action)
{
if(control.InvokeRequired) {
control.Invoke(action);
return;
}
action();
}
public static void SafeInvoke(this Control control, Action action, T obj)
{
if(control.InvokeRequired) {
control.Invoke(action, obj);
return;
}
action(obj);
}
public static void SafeInvoke(this Control control, Action action, T1 obj1, T2 obj2, T3 obj3)
{
if(control.InvokeRequired) {
control.Invoke(action, obj1, obj2, obj3);
return;
}
action(obj1, obj2, obj3);
}
public static void SafeAsyncInvoke(this Control control, Action action)
{
if(control.InvokeRequired) {
control.BeginInvoke(action);
return;
}
action();
}
public static void SafeAsyncInvoke(this Control control, Action action, T obj)
{
if(control.InvokeRequired) {
control.BeginInvoke(action, obj);
return;
}
action(obj);
}
public static void SafeAsyncInvoke(this Control control, Action action, T1 obj1, T2 obj2)
{
if(control.InvokeRequired) {
control.BeginInvoke(action, obj1, obj2);
return;
}
action(obj1, obj2);
}
public static void SafeAsyncInvoke(this Control control, Action action, T1 obj1, T2 obj2, T3 obj3)
{
if(control.InvokeRequired) {
control.BeginInvoke(action, obj1, obj2, obj3);
return;
}
action(obj1, obj2, obj3);
}
}
}
А дальше в методе если опасаетесь, что он будет вызываться не из потока в котором создавался контрол (в принципе можно ставить во всех методах работающих с контролами формы в многопоточных приложениях):
private void SetText(string text)
{
if(this.InvokeRequired) {
this.SafeInvoke(SetText, text);
return;
}
// . . .
_richtextbox.Text = text;
}
Но помните, что внутри такого метода Вы уже работаете в потоке пользовательского интерфейса. Поэтому чтобы не было торможения UI не стоит в нем делать какие-либо продолжительные по времени действия.