이것은 내 첫 번째 스택 질문이므로 내 형식이나 예의가 조금이라도 미리 사과드립니다.단위 테스트에서 '크로스 스레드 연산이 유효하지 않습니다'오류를 복제 할 수 없습니다. - 이해가 안됩니다.
최근에 별도의 스레드에서 WinForms 컨트롤과 상호 작용할 때 'cross-thread operation not valid' issues을 처리 할 패턴을 설정했습니다.
이것을 단리하기 위해 단위 테스트를 설정하고 내 SynchronisationContext 확장이 문제를 해결했다는 것을 알았 기 때문에 하나의 버튼과 'PerformClick()'이라는 코드가있는 간단한 테스트 양식을 만들었습니다. '다른 스레드에서 문제를 복제하려면 :
[STAThread]
static void Main()
{
using (TestForm form = new TestForm())
{
Thread t1 = new Thread(() => Application.Run(form));
Thread t2 = new Thread(() => form.buttonStart.PerformClick());
form.Activated += (sender, args) => t2.Start();
t1.Start();
Thread.Sleep(1000); //Prevents form from being disposed before 'click' can occur from other thread.
}
}
테스트 폼은 문자 그대로 하나의 버튼이있는 빈 양식입니다. 이 코드를 실행했을 때 예상대로 크로스 스레드 연산 예외가 발생했습니다.
그러나 코드를 NUnit 테스트에 넣으면 예외가 발생하지 않습니다. 여기 내 단위 테스트는 다음과 같습니다
[Test]
public void PostToControl_AcrossThreads()
{
//Notes: This code normally generates a cross-thread exception.
//For some reason, when you run it in the scope of the unit test, the exception is not generated.
using (TestForm form = new TestForm())
{
Thread t1 = new Thread(() => Application.Run(form));
Thread t2 = new Thread(() => form.buttonStart.PerformClick());
form.Activated += (sender, args) => t2.Start();
t1.Start();
Thread.Sleep(1000); //Prevents form from being disposed before 'click' can occur from other thread.
}
}
은 내가이 발생하는 이유 명확한 몰랐다 것을 깨달았다, 그래서 누군가가 가르치 려 수
:-) 전문가에게 던지는거야? 양식 테스트를 네이티브 방식과 비교했을 때 단위 테스트에서 다른 점이 무엇입니까?
크로스 스레딩 제어 액세스에서 예외가 발생합니다. 이것이 없으면 때로는 잘 작동하고 때로는 실패 할 것입니다 - 이것은 단순히 지속적으로 실패하게 만듭니다. – Basic
완벽한! 이것은 훌륭한 정보입니다. 답변 해 주셔서 대단히 감사합니다. – Martaver
@Martaver 첨부하여 테스트하는 동안 디버그하려고합니까? 예외가 생기고 있니? – Damith