मुझे एक यूनिट परीक्षण के साथ एक समस्या आई है जो असफल रहा क्योंकि एक टीपीएल टास्क ने कभी भी ContinueWith(x, TaskScheduler.FromCurrentSynchronizationContext())
निष्पादित नहीं किया।टास्क.कॉन्टीन्यू क्यों इस यूनिट टेस्ट में निष्पादित करने में विफल रहता है?
समस्या यह साबित हुई क्योंकि कार्य शुरू होने से पहले Winforms UI नियंत्रण गलती से बनाया जा रहा था।
यहां एक उदाहरण है जो इसे पुन: उत्पन्न करता है। आप देखेंगे कि यदि आप परीक्षण को चलाते हैं, तो यह गुजरता है। यदि आप फॉर्म लाइन के साथ परीक्षण को असम्बद्ध करते हैं, तो यह विफल हो जाता है।
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
// Create new sync context for unit test
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
var waitHandle = new ManualResetEvent(false);
var doer = new DoSomethinger();
//Uncommenting this line causes the ContinueWith part of the Task
//below never to execute.
//var f = new Form();
doer.DoSomethingAsync(() => waitHandle.Set());
Assert.IsTrue(waitHandle.WaitOne(10000), "Wait timeout exceeded.");
}
}
public class DoSomethinger
{
public void DoSomethingAsync(Action onCompleted)
{
var task = Task.Factory.StartNew(() => Thread.Sleep(1000));
task.ContinueWith(t =>
{
if (onCompleted != null)
onCompleted();
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
क्या कोई यह समझा सकता है कि ऐसा क्यों है?
मैंने सोचा था कि क्योंकि गलतSynchronizationContext
प्रयोग किया जाता है यह हो सकता है, लेकिन वास्तव में, ContinueWith
कभी नहीं सब पर निष्पादित करता है! और इसके अलावा, इस यूनिट परीक्षण में, चाहे वह सही है SynchronizationContext
अप्रासंगिक है क्योंकि जब तक waitHandle.set()
किसी भी थ्रेड पर कॉल किया जाता है, तो परीक्षण पास होना चाहिए।
क्या कोई अपवाद होता है? –
@ श्रीराम सक्थिवेल बेवकूफ सवाल - आपने 'var f = new form();' uncommented 'के साथ प्रयास किया था? मैं एक एमएसटेस्ट, वीएस2013u4, विन 8.1, नेट 4.5.1 – OffHeGoes
@ ओफहेगोस क्षमा करें मैंने इसे अनदेखा किया। अब एक उत्तर लिख रहा है :) –