2014-08-29 10 views
10

हमारे आवेदन Task.Factory.StartNew (कार्रवाई कार्रवाई) के लिए कॉल का एक बहुत है। दुर्भाग्यवश, ऐसा करने पर, संस्कृति सेट नहीं होती है, और इसके अलावा, कोई त्रुटि प्रबंधन नहीं है। मैं एक स्टार्टर वर्ग है कि दोनों क्या करना होगा के साथ शुरू हुआ:क्या मैं कार्य को रोक सकता हूं। फैक्टरी। स्टार्टन्यू?

public static class TaskBuilder 
{ 
    private static Action<System.Exception> _exceptionCallback; 

    public static Task StartNew(Action action, CultureInfo cultureInfo, Action<System.Exception> exceptionCallback) 
    { 
     _exceptionCallback = exceptionCallback; 

     return Task.Factory.StartNew(() => 
     { 
      Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 

      action.Invoke(); 
     }).ContinueWith(t => ManageException(t.Exception), TaskContinuationOptions.OnlyOnFaulted); 
    } 

    private static void ManageException(System.Exception e) 
    { 
     if (_exceptionCallback != null) 
     { 
      _exceptionCallback(e); 
     } 
    } 
} 

लेकिन तब मुझे एहसास हुआ कि एक बेहतर दृष्टिकोण एक इंटरसेप्टर होगा। मैं स्टार्टन्यू को कॉल को अवरुद्ध करना चाहता हूं ताकि नए धागे में संस्कृति और त्रुटि प्रबंधन कोड शामिल हो। इस पर मेरे प्रयास ने निम्नलिखित कोड का उत्पादन किया:

public class TaskInterceptionHandler : ICallHandler 
{ 
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     Thread.CurrentThread.CurrentUICulture = // How do I get parent cultureInfo?; 
     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 

     var methodReturn = getNext().Invoke(input, getNext); 

     if (methodReturn.Exception != null) 
     { 
      // How do I throw the exception to the calling thread here? 
     } 
     return methodReturn; 
    } 

    public int Order { get; set; } 
} 

यहां पर मैं स्टंप हो गया हूं। सबसे पहले, मैं माता-पिता CultureInfo कैसे प्राप्त करूं? दूसरा, मैं कॉलिंग थ्रेड में अपवाद कैसे लौटा सकता हूं? और मैं इस कॉल का उपयोग अपनी कॉल में कैसे करूं? अर्थात। मैं कैसे मौजूदा Task.Factory.StartNew (..)

मैं एकता उपयोग कर रहा हूँ, और मैं यहाँ अपरिचित क्षेत्र में हूँ की जगह है। किसी भी मदद या मार्गदर्शन की सराहना की जाएगी, या यहां तक ​​कि एक बेहतर समाधान भी है? शायद मैं गलत पैर पर शुरू कर रहा हूँ?

मैं .NET 4.5

प्रतिक्रिया मैं नीचे हो रही है में से अधिकांश का उपयोग कर रहा इंटरसेप्टर मार्ग से बचने के लिए लगता है। क्या यह समझना सुरक्षित है कि एक इंटरसेप्टर का उपयोग करना गलत तरीका है? अगर कोई मुझे उस दिशा में मार्गदर्शन कर सकता है, तो यह मुझे तुलना करने की अनुमति देगा। अगर प्रश्न का उत्तर हाँ है, तो मैं जानना चाहता हूं कि कैसे?

+0

नेट का कौन सा संस्करण उपयोग कर रहे हैं? .NET 4.5 एक 'CultureInfo.DefaultThreadCurrentCulture' संपत्ति (और इसके UICulture equivvalent) आप अनुप्रयोग डोमेन में सभी धागे के लिए संस्कृति सेट करने देता है कि है। –

+0

मैं .NET 4.5 – Ray

+1

अपवाद सामान का उपयोग कर रहा कोड बुला 'StartNew' निरीक्षण लौटे' Task', नहीं एक कॉलबैक में गुजर निष्पादित करने के लिए जब वहाँ एक अपवाद है द्वारा नियंत्रित किया जाना चाहिए। आप टीपीएल की त्रुटि हैंडलिंग को बदल रहे हैं, जो इसकी सबसे उपयोगी सुविधाओं में से एक है। – Servy

उत्तर

1

प्रत्येक कार्य में संस्कृति को स्थापित करने की बजाय, मेरा सुझाव है कि आप CultureInfo.DefaultThreadCurrentCulture और CultureInfo.DefaultThreadCurrentUICulture गुणों को सेट करें ताकि सभी भविष्य के धागे के लिए वैश्विक स्तर पर संस्कृति स्थापित की जा सके।

त्रुटि हैंडलिंग के बारे में, यह शायद नहीं बल्कि अपवाद को संभालने के लिए एक प्रतिनिधि गुजर की तुलना में एक आज़माएं/कैच ब्लॉक में await उपयोग करने के लिए, आसान है: BTW

try 
{ 
    // Task.Run is similar to Task.Factory.StartNew, but easier to use 
    await Task.Run(...); 
} 
catch(Exception ex) 
{ 
    // handle it... 
} 

, अपने वर्तमान त्रुटि हैंडलिंग तंत्र अगर काम नहीं करेगा आप एक ही समय में चल रहे एक कार्य की तुलना में अधिक है, वहाँ के बाद से केवल एक _exceptionCallback सभी कार्यों के लिए ...

+0

लेकिन मैं इस कोशिश को कहां पकड़ूं? – Ray

+0

@ रे, इसे उन स्थानों के आस-पास रखें जहां आप 'टास्क.फैक्टरी.स्टार्टन्यू' कहते हैं (और 'प्रतीक्षा करें' को न भूलें) –

संबंधित मुद्दे