मुझे एक समस्या का परीक्षण करने वाली इकाई इकाई है जो थ्रेड शुरू होने और समाप्त होने पर ईवेंट को सक्रिय करता है। हमलावर स्रोत का एक संस्करण में कटौती इस प्रकार है:इकाई एक थ्रेड से एक घटना फायरिंग का परीक्षण
public class ThreadRunner
{
private bool keepRunning;
public event EventHandler Started;
public event EventHandler Finished;
public void StartThreadTest()
{
this.keepRunning = true;
var thread = new Thread(new ThreadStart(this.LongRunningMethod));
thread.Start();
}
public void FinishThreadTest()
{
this.keepRunning = false;
}
protected void OnStarted()
{
if (this.Started != null)
this.Started(this, new EventArgs());
}
protected void OnFinished()
{
if (this.Finished != null)
this.Finished(this, new EventArgs());
}
private void LongRunningMethod()
{
this.OnStarted();
while (this.keepRunning)
Thread.Sleep(100);
this.OnFinished();
}
}
मैं तो जाँच करने के लिए है कि LongRunningMethod
के बाद Finished
घटना आग समाप्त हो गया है इस प्रकार एक परीक्षण है:
[TestClass]
public class ThreadRunnerTests
{
[TestMethod]
public void CheckFinishedEventFiresTest()
{
var threadTest = new ThreadRunner();
bool finished = false;
object locker = new object();
threadTest.Finished += delegate(object sender, EventArgs e)
{
lock (locker)
{
finished = true;
Monitor.Pulse(locker);
}
};
threadTest.StartThreadTest();
threadTest.FinishThreadTest();
lock (locker)
{
Monitor.Wait(locker, 1000);
Assert.IsTrue(finished);
}
}
}
तो यहाँ विचार यह है कि परीक्षण अधिकतम एक सेकंड के लिए अवरुद्ध होगा - या Finish
ईवेंट निकाल दिया गया है - यह जांचने से पहले कि finished
ध्वज सेट है या नहीं।
स्पष्ट रूप से मैंने कुछ गलत किया है क्योंकि कभी-कभी परीक्षण पास होगा, कभी-कभी यह नहीं होगा। डिबगिंग बहुत कठिन लगता है साथ ही ब्रेकपॉइंट्स जिन्हें मैं हिट करने की उम्मीद करता हूं (उदाहरण के लिए OnFinished
विधि) हमेशा ऐसा नहीं लगता है।
मुझे लगता है कि यह थ्रेडिंग कार्यों के तरीके की मेरी गलतफहमी है, इसलिए उम्मीद है कि कोई मुझे प्रबुद्ध कर सकता है।
सभी उत्तर के लिए धन्यवाद। मैंने धागा कार्यकर्ता विधि (यानी LongRunningMethod) होने पर एक और बग भी पेश किया, जब यह शुरू होता है तो इसे अपने नियंत्रण ध्वज सेट करें। आज निश्चित रूप से आपके कोड में दौड़ की स्थिति को पेश करने के तरीके में एक क्रैश कोर्स रहा है, दोह! – Dougc