불법 크로스 스레드 작업 예외에 대한 해결책이 있습니까?
-
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 스레드로의 전환을 처리합니다.