Cześć, walczę z tym problemem od kilku dni, ale rozwiązanie jest pewnie nie tam gdzie szukam.
Mam aplikację WinForms, używam w niej zwenętrznej biblioteki, która między innymi monitoruje poziom sygnału odbieranego przez mikrofon i mogę zasubskrybować tą zmianę przez wystawiony event.
W mojej klasie 'nakładce' mam obiekt reprezentujący mikrofon z nieszczęsnym eventem Microphone.LevelChanged.
Podpinam tam przy inicjaizacji mojej klasy metodę:
private void Microphone_LevelChanged(object sender, XEventArgs<float> e)
{
MicrophoneLevel = e.Item;
OnMicrophoneLevelChanged(e.Item);
}
Z kolei OnMicrophoneLevelChanged() wygląda tak:
private void OnMicrophoneLevelChanged(float value)
{
var handler = MicrophoneLevelChanged;
if (handler != null)
handler(this, new GEventArgs<float>(value));
}
Jak widać moja klasa wystawia event MicrophoneLevelChanged, do którego już w programie podpinam metodę, która ustawia progress bar na poziom zgodny z natężeniem dźwięku odbieranym przez mikrofon. Value progressbara musze ustawiać w formatce przez Invoke(), więc jak rozumiem poziom sygnału jest monitorowany gdzieś w osobnym wątku.
Klasa Microphone z zewnetrznej, nie mojej biblioteki już sama mnie informuje o zmianie poziomu sygnału i ustawiam go tak:
public void MediaHandlers_MicrophoneLevelChanged(object sender, GEventArgs<float> e)
{
if (MainForm.IsDisposed || MainForm.pbMic.IsDisposed) return;
MainForm.Invoke(new Action(() =>
{
if (MainForm.IsDisposed || MainForm.pbMic.IsDisposed) return;
MainForm.pbMic.Value = (int)e.Item;
}));
}
I tutaj problem
W zdarzeniu FormClosing formatki odpinam MediaHandlers_MicrophoneLevelChanged, a następnie formatka jak i program się zamyka.
Niestety w tym momencie debugger łapie mi wyjątek ObjectDisposedException przy próbie ustawienia MainForm.pbMic.Value.
Problem polega na tym, że MediaHandlers_MicrophoneLevelChanged przecież odpiąłem zaraz na początku FormClosing więc teoretycznie program nie powinien tam wcale wejść.
Uprzedzając: na pewno
MicrophoneLevelChanged += MediaHandlers_MicrophoneLevelChanged; zostaje wykonane tylko raz, ale dla pewności wykonuje nawet parę razy
MicrophoneLevelChanged -= MediaHandlers_MicrophoneLevelChanged; w FormClosing
Mimo tego program nadal tam wchodzi i się wywala na próbie ustawienia wartości na progressbarze.
Ręce mi opadły, macie jakieś pomysły czym to może być spowodowane i jak sobie z tym radzić?