2011-01-13 3 views
1

안녕하십니까. 대리자를 사용하지 않고 양식 컨트롤을 업데이트하기위한 솔루션을 구현하려고합니다.VB.net에서는 확장 메서드를 사용하여 크로스 스레드 예외를 방지하지 않습니다.

나는이 페이지의 첫번째 솔루션을 사용하려고 시도하고있다 :

http://www.dreamincode.net/forums/blog/143/entry-2337-handling-the-dreaded-cross-thread-exception/

Imports System.ComponentModel 
Imports System.Runtime.CompilerServices 

Public Module MyInvoke 
    <Extension()> _ 
    Public Sub CustomInvoke(Of T As ISynchronizeInvoke)(ByVal control As T, ByVal toPerform As Action(Of T)) 
     If control.InvokeRequired Then 
      control.Invoke(toPerform, New Object() {control}) 
      toPerform(control) 
     End If 
    End Sub 
End Module 

사이트가 사용하는 방법의 예로서이 제공 :

Label1.CustomInvoke(l => l.Text = "Hello World!") 

하지만 '가져 l '은 선언 된 오류가 아닙니다. 당신이 볼 수 있듯이, 나는 VB 나 OOP에 아주 새로운 것을 보았습니다.

(위임자를 사용하여) 해당 페이지에서 두 번째 솔루션을 얻을 수 있지만이 스레드에서 할 수있는 작업이 상당히 많아서 각각의 작업에 새 대리자 하위를 작성해야하는 것처럼 보입니다. 낭비.

내가해야 할 일은 콤보 박스에서 첫 번째 항목을 선택하고 선택한 항목으로 textbox.text를 업데이트 한 다음 선택한 항목을 함수에 전달하는 것입니다. 그런 다음 x 초 동안 기다린 다음 두 번째 항목을 선택하여 다시 시작하십시오.

단일 스레드 응용 프로그램에서 작동하도록 할 수는 있지만 응답 성을 유지하려면 인터페이스가 필요합니다.

도움을 주시면 감사하겠습니다.

편집 : 예를 들어 구문을 변경하면 문제가 해결됩니다.

Cross-thread operation not valid: Control 'ComboBox1' accessed from a thread other than the thread it was created on. 
: 그러나 난에 (이 그냥 괜찮 았는데)

Label1.CustomInvoke(Sub(l) l.text = "hello world!") 

에서 변경하는 경우 : 내가 심지어이 방법을 사용 didnt한다 것처럼

Dim indexnumber As Integer = 0 
ComboBox1.CustomInvoke(Sub(l) l.SelectedIndex = indexnumber) 

나는 크로스 스레딩 오류

그래서 이제 어디서 시작 했나요? 더 많은 도움을 주시면 감사하겠습니다.

+0

감사합니다, 어리석은 실수. – Steve

답변

1

두 번째 문제 별; 나는 당신이 다른 사람을 추가해야한다고 생각합니다 :

Public Sub CustomInvoke(Of T As ISynchronizeInvoke)(ByVal control As T, ByVal toPerform As Action(Of T)) 
    If control.InvokeRequired Then 
     control.Invoke(toPerform, New Object() {control}) 
    Else 
' ^^^^ 
     toPerform(control) 
    End If 
End Sub 
+0

고마워, 그게 다야. 정말로 그것을 알아 차렸을 것입니다. 적어도 뭔가 배운다! – Steve

2

VB와 C# 구문이 혼란 스럽습니다. 귀하의 람다 (거의 누락 중괄호) 유효한 C#을하지만 VB에서이 다르게 작성해야합니다 :

Label1.CustomInvoke(Sub (l) l.Text = "Hello World!") 

그리고 네,이 구문의 * CKS. 죄송합니다. :-(

2

Label1.CustomInvoke (L => l.Text = "안녕하세요!"으로)

이 구문

는 VB.NET 상당 C 번호이다 :.

... 위임자를 사용하지 않고 양식을 업데이트하는 중 ...

FYI - 이것이 사용하는 FYI - 표현식은 델리게이트의 한 형태입니다. 위임을 선언하고 정의하는 데 더 편리한 구문입니다.하지만 여기에서는 여전히 대리인을 사용하고 있습니다.

관련 문제