Отправка событий в определенную тему - PullRequest
1 голос
/ 09 ноября 2010

У меня есть ситуация, в которой я хочу, чтобы поток обрабатывал некоторую последовательную логику. Этот поток должен взаимодействовать с основным потоком для обновления ввода пользователя. Но он должен продолжать работать иначе, не мешая основному потоку. Я прыгаю, чтобы сделать это управляемым событиями способом, чтобы основной поток не должен был связывать другой поток для прерываний. Каков наилучший способ сделать это? Есть ли управляемая событиями техника взаимодействия между потоками, как в MFC?

Я использую Visual Studio 2008 и (очевидно) .Net 3.5 framework.

Ответы [ 5 ]

1 голос
/ 11 ноября 2010

Взгляните на .Net Reactive Extensions IObservable и, в частности, методы расширения SubscribeOn и ObserveOn.

ObserveOn - это место, где выполняется работа (ваш фоновый поток), SubscribeOn - это место, куда направляются уведомления (ваш пользовательский интерфейс).нить).

1 голос
/ 09 ноября 2010

Используйте компонент BackgroundWorker.

Здесь вы можете найти лучший и полный учебник по многопоточности в C # с примерами кода и примерами.

1 голос
/ 09 ноября 2010

AutoResetEvent и ManualResetEvent могут быть тем, что вы ищете.В основном ваш основной поток будет ждать, используя различные методы Wait этих классов, пока вы не отправите сигнал из другого потока, используя метод Set .Тогда ваша ветка возобновится и продолжится с тем, что наступит после того, как подождите.Это так же хорошо, как и для стиля событий.Вы должны ждать и слушать, чтобы получить реакцию на событие.Как еще вы должны прекратить работу вашего потока в случае, если вы получите событие изящно?Это невозможно с темами вообще на любом языке.

Ваша единственная другая возможность - частое прерывание и опрос.

0 голосов
/ 11 ноября 2010

Ах, ха! есть управляемый событиями способ сделать это. Я позаимствовал Dispatcher у WPF. Я просто предоставляю вращающемуся потоку доступ к главному потоку CurrentDispatcher. Я позволяю потоку вращаться, и когда ему требуется внимание, он вызывает делегата на Dispatcher и спит, ожидая, пока основной поток прервет его. Я знаю, что мог бы использовать Invoke вместо BeginInvoke, но мне нужно было использовать прерывание, потому что метод, который перезапускает рабочий поток, не является синхронной частью стека отправленных делегатов.

Хорошо это или плохо, вот мой код:

private void Run()
{
    while (true)
    {

        ... 

        // Need attention from the main thread
        // "_main" is the main thread's Dispatcher instance.
        _main.BeginInvoke(new MyEventHandler(OnNeedsAttention), this, new MyEventArgs(...));
        try
        {
            Thread.Sleep(Timeout.Infinite);
        }
        catch (ThreadInterruptedException) { }
    }
}
0 голосов
/ 09 ноября 2010

Если вы используете BackgroundWorker, вы можете вызвать событие Progress.
Вот пример о том, как обновить индикатор выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...