मुझे लगता है कि आपको जो मिला है वह बहुत अच्छा स्कॉट है।
एकमात्र मामूली समस्या जो मुझे लगता है कि कुछ इसके साथ हो सकता है, यह है कि आप अपनी देरी को निष्पादित करने के लिए थ्रेड को अवरुद्ध कर रहे हैं। बेशक यह एक पृष्ठभूमि धागा है, और समस्याओं का कारण होने की संभावना नहीं है जब तक कि आप इन कॉलों में से कई को एक साथ निष्पादित नहीं करते (प्रत्येक धागे को बांधते हैं), लेकिन यह अभी भी उप-शीर्ष है।
मैं इसके बजाय सुझाव दूंगा कि आप एल्गोरिदम को उपयोगिता विधि में कारक करते हैं, और थ्रेड का उपयोग करने से बचें। सो जाओ।
वहाँ स्पष्ट रूप से ऐसा करने का शायद असंख्य तरीके है, लेकिन यहां से एक है:
public static class UICallbackTimer
{
public static void DelayExecution(TimeSpan delay, Action action)
{
System.Threading.Timer timer = null;
SynchronizationContext context = SynchronizationContext.Current;
timer = new System.Threading.Timer(
(ignore) =>
{
timer.Dispose();
context.Post(ignore2 => action(), null);
}, null, delay, TimeSpan.FromMilliseconds(-1));
}
}
का उपयोग करें:
UICallbackTimer.DelayExecution(TimeSpan.FromSeconds(1),
() => textBlock.Text="Done");
बेशक
आप भी इस DelayExecution विधि है जो अन्य प्रकार का उपयोग करता है के एक कार्यान्वयन लिख सकता है टाइमर जैसे डब्ल्यूपीएफ डिस्पैचर टाइमर या विनफॉर्म टाइमर क्लास। मुझे यकीन नहीं है कि इन विभिन्न टाइमर का व्यापार क्या होगा। मेरा अनुमान डिस्पैचर टिमर होगा और WinForm के टाइमर वास्तव में विपरीत प्रकार के अनुप्रयोगों पर भी काम करेंगे।
संपादित करें:
फिर से पढ़ने मेरा उत्तर, मैं वास्तव में मैं एक विस्तार पद्धति है जिसके तुल्यकालन संदर्भों पर काम करता है में इस कारक के लिए परीक्षा की जाएगी लगता है - अगर आप इसके बारे में सोचते हैं, एक अधिक सामान्य बयान होगा कि आपको एक निश्चित देरी के बाद एक सिंक्रनाइज़ेशन संदर्भ में वापस पोस्ट करने में सक्षम होना चाहिए।
सिंक्रनाइज़ेशन कॉन्टेक्स्ट में पहले से ही क्यूइंग कार्य के लिए एक पोस्ट विधि है, जो मूल कॉलर पूरा होने पर अवरुद्ध नहीं करना चाहता है।क्या हम की जरूरत विलंब के बाद काम पोस्ट इस बात का एक संस्करण है, इसलिए बजाय:
public static class SyncContextExtensions
{
public static void Post(this SynchronizationContext context, TimeSpan delay, Action action)
{
System.Threading.Timer timer = null;
timer = new System.Threading.Timer(
(ignore) =>
{
timer.Dispose();
context.Post(ignore2 => action(), null);
}, null, delay, TimeSpan.FromMilliseconds(-1));
}
}
और उपयोग:
SynchronizationContext.Current.Post(TimeSpan.FromSeconds(1),
() => textBlock.Text="Done");
आप WPF [DispatcherTimer] का उपयोग उपयोग कर रहे हैं (http: // MSDN .microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx) –