Każde rozwiązanie do nielegalnej Krzyża wyjątkiem operacji wątku?

głosy
15

Gdy dane wiązania w języku C #, wątek, który zmienia dane powoduje sterowania, aby zmienić też. Ale jeśli ten wątek nie jest tym, na którym został stworzony kontrola, dostaniesz nieprawidłową Krzyż wątku obsługi wyjątku.

Czy mimo to aby temu zapobiec?

Utwórz 05/08/2008 o 08:45
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
3

Powinieneś być w stanie zrobić coś takiego:

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}

InvokeRequired jest nieruchomość na kontrole w celu sprawdzenia, czy jesteś na właściwej wątku, a następnie wywołaj będzie wywoływał delegata na odpowiednim wątku.

AKTUALIZACJA: Faktycznie, w mojej ostatniej pracy zrobiliśmy coś takiego:

private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}

który eliminuje potrzebę bloku i innego rodzaju zaciska się kod.

Odpowiedział 05/08/2008 o 08:51
źródło użytkownik

głosy
1

Ponieważ nie mam przypadek testowy, aby przejść od nie mogę zagwarantować tego rozwiązania, ale wydaje mi się, że scenariusz podobny do tego wykorzystane do aktualizacji paski postępu w różnych wątków (użyć delegata) byłby odpowiedni tutaj.

public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}

Jeżeli dane wiążące potrzeby być wykonane przez konkretnego wątku, pozwól, że nić zrobić pracę!

Odpowiedział 05/08/2008 o 08:56
źródło użytkownik

głosy
3

Jeśli modyfikacja danych nie jest zbyt czasochłonne (czyli, jeśli głównym celem wątku tła nie jest rzeczywista zmiana danych), spróbuj przenieść sekcję, która modyfikuje dane do delegata i Invoke'ing że delegata.

Jeżeli rzeczywista ciężka praca jest na danych, prawdopodobnie będziesz musiał stworzyć głęboką kopię tych danych, aby przejść do wątku tła, która wysyła przetworzone dane z powrotem do wątku UI poprzez Invoke ponownie.

Trzeba będzie tylko przenieść kod, który zmienia dane do funkcji delegata (z powodu zmiany danych, co powoduje aktualizację sterowania). Poza tym, nie powinien mieć napisać coś extra.

Odpowiedział 05/08/2008 o 09:05
źródło użytkownik

głosy
0

Jeśli wywołanie wątku jest „nielegalne” (czyli wywołanie DataBind wpływa na kontrole, które nie zostały utworzone w wątku jest ona wywołana z) Następnie należy utworzyć delegata, tak że nawet jeśli decyzja / przygotowanie do DataBind nie odbywa się w nić sterowania tworzących każdy wynikowy modyfikacja z nich (tj DataBind ()) będzie.

Można by nazwać mój kod z wątku roboczego tak:

this.BindData.Invoke();

To z kolei powoduje, że oryginalny gwint zrobić wiązania, które (zakładając, że jest to wątek, który stworzył kontroli) powinien działać.

Odpowiedział 05/08/2008 o 09:06
źródło użytkownik

głosy
0

W WPF i Silverlight infrastruktura wiązania dba o przełączenie do wątku UI.

Odpowiedział 08/08/2008 o 17:19
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more