Вот моя проблема, у меня есть класс, у которого есть объект, который бросает событие, и в этом случае я бросаю пользовательское событие из своего класса. Но, к сожалению, исходный объект бросает событие из другого потока, и поэтому мое событие также бросает другой поток. Это вызывает исключение, когда мое пользовательское событие пытается получить доступ к элементам управления.Вызвать событие из исходной темы?
Вот пример кода, чтобы лучше понять:
class MyClass
{
// Original object
private OriginalObject myObject;
// My event
public delegate void StatsUpdatedDelegate(object sender, StatsArgs args);
public event StatsUpdatedDelegate StatsUpdated;
public MyClass()
{
// Original object event
myObject.DoSomeWork();
myObject.AnEvent += new EventHandler(myObject_AnEvent);
}
// This event is called on another thread while myObject is doing his work
private void myObject_AnEvent(object sender, EventArgs e)
{
// Throw my custom event here
StatsArgs args = new StatsArgs(..........);
StatsUpdated(this, args);
}
}
Так что, когда на моих окна образуют я вызываю попробовать обновить управление от события StatsUpdated я получаю перекрестное исключение нити причины его называют по другому нить.
Что я хочу сделать, это сбросить мое пользовательское событие в исходный поток классов, чтобы в нем можно было использовать управление.
Кто-нибудь может мне помочь?
Invoke является метод, который может быть вызван из контроля, вот что я хочу сделать, это напрямую бросить мое событие на оригинальной нити (из моего класса). Поэтому в моей форме окна мне не нужно заботиться о вызове. Я могу непосредственно сделать что-то вроде «progressbar.value = arg.progress; – Karnalta
В этом случае, когда вы вызываете событие (не указанное в вашем фрагменте), вы проверяете требуемый вызов и вызываете событие внутри делегата, помещенного в метод Invoke –
Я не уверен, что понимаю, вы говорите о моем событии или событии originalObject? – Karnalta