Вывести данные из асинхронной операции в основной поток - PullRequest
0 голосов
/ 04 декабря 2009

Это «проблема», которую я имею с данными, которые я получаю из библиотеки, которая выполняет некоторые асинхронные операции при отправке и получении данных. В то время как я получаю данные и получаю данные в моей Мобильной Форме Windows или Рабочем столе, мне нужно иметь дело с операцией перекрестного потока. Я имею дело с этим, когда проверяю InvokeRequired и выполняю действие, если оно истинно ... и т. Д. Но, на самом деле, мне бы хотелось, чтобы это исчезло и я правильно получил свои данные, чтобы я мог связать их с манипуляциями и т. Д., Не обрабатывая эту многопоточность проблема.

Вопрос: как я могу манипулировать данными в моей библиотеке и затем вызывать событие для клиента? Где они могли бы все, что они хотят, без сделки кросс поток обработки.

Это должно быть допустимо и для Compact Framework, поскольку клиенты являются мобильными клиентами. И именно поэтому решение, найденное с помощью ISynchronizeInvoke, недопустимо.

Любая помощь, чтобы сделать это приятно ценится! Заранее спасибо.

1 Ответ

1 голос
/ 04 декабря 2009

Вы можете создать COntrol в конструкторе вашей библиотеки, затем вызвать его и вызвать событие после вызова. Затем потребитель получит событие в контексте потока, создавшего ваш библиотечный класс. Если вы сделаете его Компонентом, скорее всего, он будет создан в потоке пользовательского интерфейса, и поэтому ваши события будут вызываться в потоке пользовательского интерфейса.

РЕДАКТИРОВАТЬ 1

Как пример:

private Control m_invoker = new Control();
public event EventHandler MyEvent;

private void RaiseMyEvent(object o, EventArgs args)
{
    EventHandler handler = MyEvent;
    if (handler == null) return;

    if (m_invoker.InvokeRequired)
    {
        m_invoker.BeginInvoke(new EventHandler(RaiseMyEvent), 
                              new object[] { o, args });
        return;
    }

    handler(o, args);
}

Таким образом, ваш код вызвал бы RaiseMyEvent, который, в свою очередь, переносит вызов в поток, который создает текущий объект, а затем вызывает фактическое событие.

...