Я использую Func <> или Action <>. BeginInvoke для асинхронного запуска методов с помощью ThreadPool.
Возможно ли, чтобы AsyncCallback вызывал функцию (или событие, технически) в исходном потоке, который породил новый поток?
Я знаю, что в приложениях WinForms вы можете использовать Control / ISynchronizeInvoke / Dispatcher для оповещения потока пользовательского интерфейса о завершении асинхронных операций, но это не приложение WinForms и, похоже, оно не работает.
class SyncTest : System.ComponentModel.ISynchronizeInvoke
{
public void TestMethod() {
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId + " Test Method Fired.");
}
public IAsyncResult BeginInvoke(Delegate method, object[] args) {
throw new NotImplementedException();
}
public object EndInvoke(IAsyncResult result) {
throw new NotImplementedException();
}
public object Invoke(Delegate method, object[] args) {
return method.DynamicInvoke(args);
}
public bool InvokeRequired {
get { throw new NotImplementedException(); }
}
public void Test()
{
var sleep = new Action(() => System.Threading.Thread.Sleep(5000));
System.ComponentModel.ISynchronizeInvoke originalThreadCallback = (System.ComponentModel.ISynchronizeInvoke)this;
for (int i = 0; i < 5; i++)
{
sleep.BeginInvoke(new AsyncCallback(res =>
{
(res.AsyncState as Action).EndInvoke(res);
Console.WriteLine("Thread inside callback: " + System.Threading.Thread.CurrentThread.ManagedThreadId);
originalThreadCallback.Invoke(new Action(() => this.TestMethod()), null);
}), sleep);
}
}
}
Выходные данные метода Test () следующие:
Основная нить = 9
ТЕСТ СДЕЛАНО
Тема внутри обратного вызова: 11
Тема внутри обратного вызова: 10
10 Метод испытаний запущен.
11 Метод испытания запущен.
Тема внутри обратного вызова: 12
12 Метод испытания запущен.
Тема внутри обратного вызова: 13
13 Метод испытания сработал.
Тема внутри обратного вызова: 14
14 Метод испытания сработал.
Как вы видите, в исходном потоке ничего не вызывается с ID = 9.
Очевидно, что моя реализация ISynchronizeInvoke на самом деле ничего не делает для вызова метода Test в исходном потоке, и в этом проблема - но я также не могу получить экземпляр ISynchronizeInvoke из любого из моих делегатов или событий (это всегда ноль). Какие объекты в .NET 4 правильно реализуют интерфейс?
Спасибо.