불법 크로스 스레드 작업 예외에 대한 해결책이 있습니까?

StackOverflow https://stackoverflow.com/questions/1994

  •  08-06-2019
  •  | 
  •  

문제

C#에서 데이터 바인딩을 하면 데이터를 변경하는 스레드로 인해 컨트롤도 변경됩니다.그러나 이 스레드가 컨트롤이 생성된 스레드가 아닌 경우 잘못된 크로스 스레드 작업 예외가 발생합니다.

어쨌든 이것을 방지할 수 있는 방법이 있나요?

올바른 솔루션이 없습니다

다른 팁

다음과 같은 작업을 수행할 수 있어야 합니다.

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

InvokeRequired는 올바른 스레드에 있는지 확인하기 위한 컨트롤의 속성입니다. 그러면 Invoke는 올바른 스레드에서 대리자를 호출합니다.

업데이트:사실, 나의 마지막 직장에서 우리는 다음과 같은 일을 했습니다.

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

    // Regular handling code
}

그러면 else 블록이 필요하지 않고 코드가 좀 더 강화됩니다.

진행할 테스트 사례가 없기 때문에 이 솔루션을 보장할 수는 없지만 다른 스레드에서 진행률 표시줄을 업데이트하는 데 사용되는 시나리오(대리자를 사용)와 유사한 시나리오가 여기에 적합할 것 같습니다.

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

public void DoDataBind()
{
    DataBind();
}

특정 스레드에서 데이터 바인딩을 수행해야 하는 경우 해당 스레드가 작업을 수행하도록 하세요!

스레드 호출이 "불법"인 경우(예:DataBind 호출은 호출되는 스레드에서 생성되지 않은 컨트롤에 영향을 미칩니다. 그런 다음 DataBind에 대한 결정/준비가 컨트롤 생성 스레드에서 수행되지 않더라도 결과적인 수정이 이루어지도록 대리자를 생성해야 합니다. 그들(즉DataBind())가 됩니다.

다음과 같이 작업자 스레드에서 내 코드를 호출합니다.

this.BindData.Invoke();

그러면 원본 스레드가 바인딩을 수행하게 되며, 이는 컨트롤을 생성한 스레드라고 가정하여 작동합니다.

WPF 및 Silverlight에서는 바인딩 인프라가 UI 스레드로의 전환을 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top