2013-02-22 3 views
0

문제 : 일반 목록을 사용하는 방법은 처리하는 데 오래 걸립니다. 따라서 방법은 배경 작업자에게 맡겨야합니다.BackgroundWorker : BackgroundWorker로 일반 목록 전달

문제는 다음과 같습니다. 일반 목록을 백그라운드 워커에서 어떻게 액세스 할 수 있습니까?

[Call] 
backgroundWorker.RunWorkerAsync(new Tuple<string, int, List<T>>(aInfo, aCount, aGenericList)); 

... 
[DoWork] 
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
      BackgroundWorker worker = sender as BackgroundWorker; 


      Tuple<string, int, List<T>> aTuple = (Tuple<string, int, List<T>>)e.Argument; // won't work as <T> is not known 
... 
} 

나는

private void backgroundWorker_DoWork<T>(object sender, DoWorkEventArgs e, List<T> theList) where T : Interface 

처럼 뭔가를 좋아하지만이 어떻게 사용될 수 있는지 단서가 없을 것입니다.

나는 분명한 뭔가를 놓치고 있습니까?

+0

목록을 전역 변수로 선언 할 수 있습니다. 아니면 클래스 범위에 넣으십시오 –

+0

@GianAcuna 글로벌 varialbe 마찬가지로 나는 그것을 만드는 방법에 문제가있을 것입니다. 'private List aList; '는 컴파일되지 않습니다 (T를 알 수 없으므로) – Offler

+0

어딘가에 을 알아야합니다! RunWorkerAsync()를 호출하면 어떻게 알 수 있습니까? –

답변

1

이 같은 문제에 대한 일반적인 접근 방식은 당신이 당신의 일반의 요소를 노출하는 인터페이스를 사용할 수 있습니다이 경우 귀하의 제네릭 형식

에서 필요한 속성/메서드를 노출하는 제네릭이 아닌 인터페이스를 만드는 것입니다 배경 작업자가 사용할 것으로 예상되어, IListItem 말 :

그런 다음이 목록으로 귀하의 일반적인 목록을 통과 방식에 캐스팅 (나는 또한 IEnumerable을 사용한 적이 있습니다 - 아래 참조) :

backgroundWorker.RunWorkerAsync(new Tuple<string, int, 
     IEnumerable<IListItem>>(aInfo, aCount, aGenericList.Cast<IListItem>())); 

목록을 전달하려면 인터페이스 유형으로 목록을 다시 채워야합니다.

마지막으로, DoWork 방법 당신은 지금 당신이 알고 뭔가 캐스트 할 수 있습니다 : 당신이 실제로 작업자의 변경 가능한 목록이 필요하면 Cast 방법은이 유형을 반환하기 때문에

Tuple<string, int, IEnumerable<IListItem>> aTuple = 
      (Tuple<string, int, IEnumerable<IListItem>>)e.Argument; 

내가 IEnumerable을 사용하고 솔루션은 약간 다를 것입니다 (목록이 변경되면 잠금을 시작해야 함을 의미하기 때문에 더 지저분합니다).

+0

내 대답은 :이 메서드는 사용자의 소원에 의해 다른 PC로 개체를 전송하는 데 사용됩니다.제네릭 메서드를 사용하기 전에 List 과 멤버에 액세스 할 때 (완전한 objet를 전송해야 함) 모든 멤버가 액세스 할 수없는 문제가있었습니다. 따라서 오랜 시간 동안 일반적인 방법으로 변경되었으며 거의 ​​모든 인터페이스가 응용 프로그램에서 사라졌습니다. – Offler

+0

그 다음에 전환 메커니즘이 무엇입니까? 클래스를 작업자에게 전달하기 전에 클래스를 직렬화해야 할 수 있습니다. –

+0

개체 자체의 메서드가 호출됩니다. BaseClasses는 적절한 WCF 연결을 열고 개체와 하위 개체를 전달합니다 (또는 속성 만 변경하는 경우 몇 가지 속성 만 전송). 그리고 인터페이스를 사용하여 sthe 속성에 액세스하려고 할 때 일부 속성이 더 이상 발견되지 않습니다. (귀하의 대답이 정확하지 않다고 생각하지는 않습니다, 가능한 방법이어야합니다. 그러나 backgroundworker에서 제네릭을 구할 수있는 방법이 있는지 알고 싶습니다.) – Offler

관련 문제