2013-12-09 3 views
0

DataGrid에서 마스터 고객을 여는 버튼이있는 기본 폼이 있습니다. dataview.rowfilter를 사용하여 데이터를 필터링하기 위해 dataview를 사용합니다. 양식로드 중에 문제가 발생했습니다. 5 ~ 6 초가 소요됩니다 (프로그램이 응답하지 않습니다). 내가 뭘 하려는지 배경에있는 데이터 뷰에 데이터를로드하고 workercompleted에 gridview에 표시하는 것입니다.backgroundworker throw "양식을 만드는 동안 오류가 발생했습니다 ..."

"폼을 만드는 동안 오류가 발생했습니다. 자세한 내용은 Exception.InnerException을 참조하십시오. 오류 : OLE 호출을 만들기 전에 현재 스레드를 단일 스레드 아파트 (STA) 모드로 설정해야합니다. Main 함수에 STAThreadAttribute가 표시되어 있습니다. " -> on dowork

어딘가에서 Invoke를 사용해야합니다. 그러나 나는 그것을 어떻게 사용하는지 모른다.

Private Sub custcall_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    TBfind.Enabled = False 
    SetMyCustomFormat("yyyy-MM-dd HH:mm:ss") 
    BWcustload.RunWorkerAsync() 

End Sub 

Private Sub BWcustload_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BWcustload.DoWork 

    mydataview = New DataView(datatablecust) 
End Sub 

Private Sub BWcustload_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BWcustload.RunWorkerCompleted 
    DGVcustomer.DataSource = mydataview 
    TBfind.Enabled = True 
End Sub 

답변

0

당신이 이벤트 Form_Shown에 코드를 이동 봤어 : 여기 내 코드?

또한 SyncLock 내부의 DoWork 섹션에 코드를 삽입 해 보았습니까? 코드에이를 추가하려고 ... STA 모델에 관해서는

SyncLock mydataview 

    mydataview = New DataView(datatablecust) 

End SyncLock 

과 하위 홈페이지()

<STAThread()> _ 
    Public Shared Sub Main() 
     Dim mainForm As New custcall() 
     Application.Run(mainForm) 
    End Sub 

편집에 시작 개체를 설정합니다 :

이 시도

호출과 관련된 부분입니다. ... 그것도 확실히 작동 할 것입니다 ...하지만 그것은 STAThread 문제를 해결했을 것입니다 모르겠어요.

이 호출을 사용하려면 먼저 양식에 위임 하위를 선언해야 :

Delegate Sub LoadDataCallback() 

데이터의 실제로드 돌봐 함수를 선언 :

다음
Private Sub LoadData() 
    mydataview = New DataView(datatablecust) 
End Sub 

, 표시된 이벤트 (또는 이벤트로드)에서 새 스레드를 시작합니다.

Dim mythread As New Thread(Sub() 
           Dim callLoad As New LoadDataCallBack(LoadData) 

           Me.Invoke(callLoad) 
          End Sub) 

mythread.Start() 

SyncLock을 사용해야하는 경우 (제대로 작동하지 않는 경우가있을 수도 있지만).

Imports System.Threading을 코드 파일의 맨 위에 추가하는 것을 잊지 마십시오.

+0

답장을 보내 주셔서 감사합니다. synclock 메서드를 사용하면 snyclock 부분에 "declaration expected"오류가 발생합니다. invoke 메소드를 사용하면 작동하지만 5 ~ 6 초의 로딩 시간이 필요합니다. – user2771233

+0

SyncLock에 적합한 개체를 추가하는 것을 기억하고 있습니까? 위의 내용에 "SyncLock mydataview"를 입력했습니다. 컨트롤에 가져온 레코드 수를 확인하고 폼에보고하여 다른 스레드를 추가하여로드 진행률을 모니터링하여 데이터가 여전히 있음을 알 수 있습니다 로드. 안타깝게도 가져 오기가 필요한 많은 데이터가있는 경우에는로드 시간에 대해별로 신경 쓰지 않아도됩니다. –

관련 문제