2014-09-30 3 views
0

C#으로 작성된 응용 프로그램이 있습니다. 클래스 (아래 ClassA)는 간단한 이벤트 (아래 코드)가 있습니다. 이 이벤트는 사용자가 코드 진행 상황을 계속 업데이트하도록하기 위해 발생합니다.멀티 스레드 및 이벤트 발생

public delegate void MyDelegateProgessUpdate(string value); 
    public event MyDelegateProgessUpdate ProgressUpdate; 

응용 프로그램이 실행 중일 때 ClassA 개체 목록이 만들어집니다 (최대 8 개). 그래서 모든 8 개의 객체가 이벤트를 올릴 것입니다 (자신의 클래스에서) - 이것은 방금 테스트 한 것처럼 잘 작동합니다. 그러나 문제가있을 경우 두 객체가 동시에 이벤트를 발생시키는 지 궁금합니다.

나는 다음과 같은 세부 사항을 언급해야

편집. ClassA 객체의 목록은 모두 동시에 실행되므로 이벤트를 동시에 발생시킬 수 있습니다.

Task[] myTasks = new Task[numThreads]; 

for (int i = 0; i < myTasks.Length; i++) 
      myTasks [i] = Task.Factory.StartNew(ClassA[i].DoSomeWork, someData[i]); 

이것은 모두 백그라운드 작업자 스레드에서 수행됩니다. 이벤트가 발생하면 WPF UI의 속성이 업데이트되고 OnPropertyChanged 이벤트가 호출됩니다. 코드 자체는 더 더 문제가없는 다음 threadsave을하지 않는 경우

:

+0

스레드를 사용하여 편집 한 후 : 내 답변에서 언급 한 것처럼 : 스레드 안전성은 메서드의 필수 요소이며, 사용자가 수행하는 작업과 스레드를 실행할 때 매우주의해야합니다. 당신은 방법들을 호출합니다 ...다른 프로세스들로부터 (그리고 그 중 하나는 꽤 많은 문제를 제기 할 수 있습니다. – Thomas

답변

1

는 대답은 전적으로 이벤트에 의해 실행되는 코드 (코드)에 따라 달라집니다. 코드가 100 % 쓰레드 섹터가 아니라면 네 손에 문제가있을 수 있습니다 (일어날 레이싱 조건).

그 자체로는 동일한 이벤트를 발생시키는 여러 객체에 복잡한 문제가 없습니다. 이는 이벤트 자체의 코드와 오브젝트가 이벤트를 발생시킬 수있는 권한을 가지고 있는지 여부에 달려 있습니다. 당신이 당신의 자신의 스레드에 있고, 당신은 당신이 코드가있는 경우 즉 문제

이있을 것이다 다른 호출 사용할 필요가 자체 스레드에서 실행되는 GUI에 이벤트를 발생하려고하면 예를 들어 (예를 들어 하나의 이벤트로 설정된 여러 핸들러와 같이) 이벤트가 발생하는 방식과 이벤트를 발생시키는 방법을 보여주는 코드 예제가없는 곳에

1

두 개체가 동시에 이벤트를 발생시키는 방법은 무엇입니까? 제공 한 코드와 설명에서 이것은 실제로 멀티 스레드 코드임을 제안하는 것이 아니며 이벤트는 발생한 순서대로 처리됩니다.

스레드가 여러 개인 경우 이벤트 처리기가 이벤트를 발생시킨 스레드에서 실행된다는 점을 기억해야합니다. 따라서 사용자 인터페이스 항목을 수정해야하는 경우 조심해야합니다. 리소스는 스레드간에 공유됩니다.

편집 :

내 경험이 대부분 윈폼처럼 정말, WPF 관련하여 언급 할 수는 있지만 this answer는 WPF에서 스레드 간 물건을 관리에 관해서에 꽤 포괄적 나타납니다.

그 외에도 이벤트 사이에 단일 데이터 세트를 공유하지 않는다면 이벤트가 동시에 제기 될 것으로 예상되지 않습니다.