Вызов делегата в консольном приложении - PullRequest
1 голос
/ 10 августа 2011

Мне нужно перенести приложение WinForm в консольное приложение.

В приложении WinForm у меня есть что-то вроде:

this.Invoke(new LogResponseCallback(this.LogResponse), new object[] { allAlarmsJson });


   private delegate void LogResponseCallback(string text);
    private void LogResponse(string response)
    {
        this._richTextResponse.Text = response + "\r\n";
    }

Похоже, что основной поток был вызван после обработки определенной операции.

Меня беспокоит то, как можно выполнить тот же асинхронный вызов делегата в консольном приложении.

Любая помощь будет принята с благодарностью.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 10 августа 2011

Вот вопрос, который я задал о том, как Invoke делает то, что он делает,

Интересует реализация Control.Invoke ()

0 голосов
/ 10 августа 2011

Прежде всего, вы не используете в своем коде асинхронный делегат, this.Invoke - это синхронный вызов.
Во-вторых, если вы запускаете консольное приложение, вам не нужно перенаправлять обратный вызов в основной поток. Это следует делать только при выполнении кода, который опирается на поток, например winforms, поток пользовательского интерфейса wpf и некоторые компоненты COM. выполнять вызовы в этих ситуациях только потому, что эти компоненты зависят от потока, который их создал

0 голосов
/ 10 августа 2011

Обычно в Windows Forms вы используете Control.Invoke, чтобы вернуться к потоку пользовательского интерфейса из фонового потока, поскольку вы не можете получить доступ к элементам управления пользовательского интерфейса в потоке, не являющемся пользовательским интерфейсом.

То же ограничениене применяется в консольном приложении - вам может все еще нужно быть осторожным, чтобы избежать проблем с многопоточностью, но они вряд ли будут такими же.Если все, что вы делаете, это входите в консоль (например, с помощью Console.WriteLine), вам будет достаточно просто выполнить запись в фоновом потоке.

...