Нет способа явно запустить код в определенном потоке (кроме потока, который использовался для создания элементов управления пользовательским интерфейсом - это исключение), но если вы просто хотите вызвать код, отличный от кода, после завершения потока , Вы используете делегатов.
Сначала объявите делегата с подписью метода, который вы хотите запустить в новом потоке ...
public delegate bool CheckPrimeDelegate(long n);
Затем в своем коде создайте экземпляр делегата, вызовите его с помощью BeginInvoke (передавая любые необходимые параметры) и ПРОЙДИТЕ делегат функции обратного вызова (OnChkPrimeDone)
class MyClassApp
{
static void Main()
{
CheckPrimeDelegate ckPrimDel = new CheckPrimeDelegate(Prime.Check);
// Initiate the operation
ckPrimDel.BeginInvoke(4501232117, new AsyncCallback(OnChkPrimeDone), null);
// go do something else . . . .
}
static void OnChkPrimeDone( IAsyncResult iAr)
{
AsyncResult ar = iAr as AsynchResult;
CheckPrimeDelegate ckPrimDel = ar.AsyncDelegate as CheckPrimeDelegate;
bool isPrime = ckPrimDel.EndInvoke(ar);
Console.WriteLine(" Number is " + (isPrime? "prime ": "not prime");
}
}
Когда это будет сделано, он вызовет функцию обратного вызова (OnChkPrimeDone)
Если вам явно необходимо запустить эту функцию обратного вызова в потоке, который использовался для создания объекта COM Active-X, то проверьте переменную-оболочку .Net Managed Code, которая содержит ссылку на этот объект ... Если она имеет метод с именем InvokeRequired (), затем в функции обратного вызова проверьте логическое возвращаемое значение этого метода.
Если у него есть метод InvokeRequired () и он возвращает true, тогда объект active-X также предоставит метод «BeginInvoke ()». Затем создайте ДРУГОЙ делегат, заполненный той же функцией, и вызовите BeginInvoke
на объекте Active-X, передавая этому новому делегату ... Затем он будет работать в том же потоке, который использовался для создания объекта Active-X
If (MyActiveXObject.InvokeRequired())
MyActiveXObject.BeginInvoke(...);