मैं छद्म कोडasync में CurrentCulture रखें/इंतजार
string GetData()
{
var steps = new List<Task<string>>
{
DoSomeStep(),
DoSomeStep2()
};
await Task.WhenAll(steps);
return SomeResourceManagerProxy.RetrieveValuesForLocalizedStrings(steps.Select(s => s.Result));
}
इस विधि WebService, जहां मैं उपयोगकर्ता के ब्राउज़र सेटिंग्स के अनुसार Thread.CurrentUICulture
सेट से कहा जाता है निम्नलिखित है।
प्रतीक्षा के बाद, CurrentUICulture
खो गया है (मैं अलग-अलग धागे पर चलता हूं)।
मैं निम्नलिखित के साथ इस मुद्दे को हल किया है:
public class MyAwaiter<T> : INotifyCompletion
{
private TaskAwaiter<T> waiter;
private CultureInfo culture;
public MyAwaiter(TaskAwaiter<T> waiter)
{
this.waiter = waiter;
}
public PreserveCultureAwaiter<T> GetAwaiter() { return this; }
public bool IsCompleted { get { return waiter.IsCompleted; } }
public void OnCompleted(Action continuation)
{
culture = Thread.CurrentThread.CurrentUICulture;
waiter.OnCompleted(continuation);
}
public T GetResult()
{
Thread.CurrentThread.CurrentUICulture = culture;
return waiter.GetResult();
}
}
public static MyAwaiter<T> KeepCulture<T>(this Task<T> task)
{
return new MyAwaiter<T>(task.GetAwaiter());
}
...
await Task.WhenAll(steps).KeepCulture();
यह एक दोष यह है - पर KeepCulture() कॉल करने के लिए हर कार्य किया जाता है कि समय से प्रतीक्षा की जा रही याद रखने के लिए की जरूरत है। (यूआई संस्कृति को कार्य में रखने के लिए मेरे पास कुछ विस्तार विधि भी है)।
क्या यूआई संस्कृति को संरक्षित करने का कोई आसान तरीका है?
एक नोट: मैं सामान के स्थानीयकरण के लिए ढांचा लिख रहा हूं जो पहले से ही एसिंक/प्रतीक्षा सामग्री में लिखा गया था। मैं चाहता हूं कि सबकुछ अन्य डेवलपर्स के जितना संभव हो उतना पारदर्शी हो, – nothrow
मैंने कुछ समय पहले .NET रिपॉजिटरीज़ में से एक में एक समान समाधान देखा है। यह ईएफ हो सकता है। मुझे लगता है कि उन्होंने इसे किसी कारण से हटा दिया है, इसलिए आपको लॉग स्कैन करने की आवश्यकता है। – usr
शायद इस क्यू + ए को बंद करने का समय, समस्या ठीक हो गई थी। –