Я сбросил угловой json из более старой резервной копии и сбросил все, и проблемы исчезли
При ударе могло бы стоить попробовать что-то как следующее, которое использует 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();
}
}
У меня есть еще некоторая информация об этой проблеме (я работаю в той же команде 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 от блокирования неограниченно долго. Я думаю... :)
Любые идеи о том, как выполнить это, были бы фантастическими.
У Вас есть источник для компонента? Это кажется, что полагается на факт, которым это назовут от среды WinForms (должно быть серьезное основание, почему библиотека наследовалась Форме!), но трудно знать наверняка.