Обертывание асинхронного метода синхронно в C#

Я сбросил угловой json из более старой резервной копии и сбросил все, и проблемы исчезли

7
задан mikecamimo 24 January 2009 в 06:20
поделиться

3 ответа

При ударе могло бы стоить попробовать что-то как следующее, которое использует WaitHandle для блокирования текущего потока вместо того, чтобы вращать и проверить флаг.

using System;
using System.Threading;

class Program
{
    AutoResetEvent _autoEvent;

    static void Main()
    {
        Program p = new Program();
        p.RunWidget();
    }

    public Program()
    {
        _autoEvent = new AutoResetEvent(false);
    }

    public void RunWidget()
    {
        ThirdParty widget = new ThirdParty();           
        widget.Completed += new EventHandler(this.Widget_Completed);
        widget.DoWork();

        // Waits for signal that work is done
        _autoEvent.WaitOne();
    }

    // Assumes that some kind of args are passed by the event
    public void Widget_Completed(object sender, EventArgs e)
    {
        _autoEvent.Set();
    }
}
8
ответ дан 7 December 2019 в 01:27
поделиться

У меня есть еще некоторая информация об этой проблеме (я работаю в той же команде mikecamimo).

Проблема также происходит в приложении Windows Forms при корректном тиражировании. В исходном OP проблема не произошла в форме окон, потому что не было никакого блокирования. Когда блокирование представлено при помощи ResetEvent, та же проблема происходит.

Это вызвано тем, что обработчик событий (Widget_Completed) находится на том же потоке как метод, называя Виджет. DoWork. Результат, что AutoResetEvent. WaitOne (); блоки навсегда, потому что обработчик событий никогда не называют для Установки события.

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

using System;
using System.Threading;
using System.Windows.Forms;

class Program
{
    EventArgs data;

    static void Main()
    {
        Program p = new Program();
        p.RunWidget();
    }

    public Program()
    {
        _autoEvent = new AutoResetEvent(false);
    }

    public void RunWidget()
    {
        ThirdParty widget = new ThirdParty();                   
        widget.Completed += new EventHandler(this.Widget_Completed);
        data = null;
        widget.DoWork();

        while (data == null);
            Application.DoEvents();

        // do stuff with the results of DoWork that are contained in EventArgs.
    }

    // Assumes that some kind of args are passed by the event
    public void Widget_Completed(object sender, EventArgs e)
    {
        data = e;
    }
}

В приложении форм не для Windows, таком как служба Windows, Приложение не доступно, таким образом, DoEvents нельзя назвать.

Проблемой является одна из поточной обработки и того виджета. Обработчик событий, связанный с DoWork так или иначе должен быть на другом потоке. Это должно предотвратить AutoResetEvent. WaitOne от блокирования неограниченно долго. Я думаю... :)

Любые идеи о том, как выполнить это, были бы фантастическими.

1
ответ дан 7 December 2019 в 01:27
поделиться

У Вас есть источник для компонента? Это кажется, что полагается на факт, которым это назовут от среды WinForms (должно быть серьезное основание, почему библиотека наследовалась Форме!), но трудно знать наверняка.

0
ответ дан 7 December 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: