2013-10-15 3 views
1

나는 액션 위임을 정지.DataGridView.Invoke는

Parallel.Invoke(SubscribeForTable); 

그래서 그것을 실행하는 시작하고, 난 기다릴 ... 난 기다릴 ... 그리고 아무 반응이 없습니다 :

그때 나는이 할! 응용 프로그램이 멈췄습니다! 그런 다음 디버거를 시작했습니다.

복귀 기능 SubscribeMe()

Parallel.For(0, ACCESS.GetAppCount(), AppCheck); //OK 
CheckTable(true); // lets see what is in 

은 그 때 나는
delegate void CheckTableCallback(bool check); 

private void CheckTable(bool Subscribed) 
{ 
    if (DataGridView1.InvokeRequired) // OK 
    { 
     CheckTableCallback Safe = new CheckTableCallback(CheckTable); // OK 
     DataGridView1.Invoke(Safe, new Object[] {Subscribed}); //HANGS HERE! 
    } 
    else 
    { 
     .... 

은 그래서 DataGridView.Invoke에 달려 ..이 함수로 보았다. 왜 그렇게? 희망을 올바르게 내 문제를 설명했다.

+1

Invoke()를 사용하면 교착 상태가 발생할 수 있으므로 항상 BeginInvoke()를 사용하십시오. 이 교착 상태는 일반적으로 작업자 스레드가 완료 될 때까지 대기중인 UI 스레드가 사용 중이기 때문에 발생합니다. 그것은 기다려서는 안된다. Debug + Windows + Threads를 사용하여 디버깅하십시오. –

답변

2

Control.Invoke은 의도적으로 UI 스레드가 메시지를 처리 ​​할 수있을 때까지 현재 스레드를 차단합니다.

UI 스레드에서 Parallel.For 루프를 호출하면 UI 스레드가 완료 될 때까지 차단됩니다.

두 가지 원인이 하나의 작업합니다 (Invoke 호출) UI 스레드 (Parallel.For)를 다른 완료하고 무료 년대까지 완료 할 수 있지만, 개별 작업 항목이 완료 될 때까지 초 완료 할 수없는 상태.

방금 ​​UI를 업데이트하는 경우 여기에서 데드 록을 피하려면 Invoke 대신 BeginInvoke을 사용할 수 있습니다. 그러면 실제 메소드 (CheckTable)가 실행되고 이후에 값이 으로 설정되고 전체 작업이 완료됩니다.

+0

처럼'BeginInvoke' 작품, 고마워요! –