क्या प्रत्येक डब्ल्यूसीएफ सेवा कॉल Async बनाने का कोई कारण है?क्या प्रत्येक डब्ल्यूसीएफ कॉल असिनक बनाने का कोई कारण है?
मैं अपने साथी के साथ यह चर्चा कर रहा था। वह UI को लॉक करने से बचने के लिए प्रत्येक WPF सेवा कॉल Async बनाना चाहता है (यह एक डेस्कटॉप WPF एप्लिकेशन है)। मैं इस विचार के खिलाफ हूं। मुझे लगता है कि ज्यादातर मामलों में एसिंक कॉल की आवश्यकता नहीं है, और जब इसकी आवश्यकता होती है तो अनुरोधिंग क्लास और डेटामैनेजर को विशेष रूप से Async कॉल को संभालने के लिए कोड किया जाना चाहिए।
इसके लिए मेरे तर्क यह है कि सबकुछ के लिए कॉलबैक सेट अप करने के लिए कहीं अधिक कोड है और यह बहुत भ्रमित है। मुझे यह भी लगता है कि इससे प्रदर्शन में कमी आ सकती है, हालांकि मैंने अभी तक यह सत्यापित नहीं किया है। उनका तर्क यह है कि कभी-कभी आपको बहुत अधिक डेटा मिल रहा है और यह यूआई को लॉक कर देगा, और ऐसा डब्ल्यूसीएफ कॉल सेट करने के लिए इतना काम नहीं है (उसे निम्नलिखित कोड भ्रमित नहीं लगता है)।
हमने दोनों पहले कभी डब्लूसीएफ सर्वर के साथ काम नहीं किया है, इसलिए मैंने सोचा कि मैं उसे संदेह का लाभ दूंगा और कुछ अन्य विचारों के लिए यहां पूछूंगा।
उदाहरण के लिए:
माय वे:
public override User GetById(int id)
{
return new User(service.GetUserById(id));
}
यह यूआई, UserDataManager, और उपयोगकर्ता DataTransferObject साथ WCF सर्वर रिटर्न जब तक WCF सेवा चैनल ताले, लेकिन यह समझने में आसान है और कोड के लिए जल्दी। इसका उपयोग अधिकांश डब्ल्यूसीएफ सेवा कॉल के लिए किया जाएगा जब तक कि वास्तव में डेटा प्राप्त करने में देरी की उम्मीद न हो, इस स्थिति में डेटामैनेजर Async कॉल को संभालने के लिए सेटअप किया जाएगा।
उनका रास्ता: आधार वर्ग पर
public override void GetById(int id, Action<UserGroup> callback = null)
{
// This is a queue of all callbacks waiting for a GetById request
if (AddToSelectbyIdQueue(id, callback))
return;
// Setup Async Call
var wrapper = new AsyncPatternWrapper<UserDTO>(
(cb, asyncState) => server.BeginGetUserById(id, cb, asyncState),
Global.Instance.Server.EndGetUserById);
// Hookup Callback
wrapper.ObserveOnDispatcher().Subscribe(GetByIdCompleted);
// Run Async Call
wrapper.Invoke();
}
private void GetByIdCompleted(UserDTO dto)
{
User user = new User(dto);
// This goes through the queue of callbacks waiting
// for this method to complete and executes them
RunSelectIdCallbacks(user.UserId, user);
}
कॉलबैक कतार:
/// <summary>
/// Adds an item to the select queue, or a current fetch if there is one
/// </summary>
/// <param name="id">unique object identifier</param>
/// <param name="callback">callback to run</param>
/// <returns>False if it needs to be fetched, True if it is already being
/// fetched</returns>
protected virtual bool AddToSelectbyIdQueue(int id, Action<T> callback)
{
// If the id already exists we have a fetch function already going
if (_selectIdCallbacks.ContainsKey(id))
{
if(callback != null)
_selectIdCallbacks[id].Add(callback);
return true;
}
if (callback != null)
{
List<Action<T>> callbacks = new List<Action<T>> {callback};
_selectIdCallbacks.Add(id, callbacks);
}
return false;
}
/// <summary>
/// Executes callbacks meant for that object Id and removes them from the queue
/// </summary>
/// <param name="id">unique identifier</param>
/// <param name="data">Data for the callbacks</param>
protected virtual void RunSelectIdCallbacks(int id, T data)
{
if (_selectIdCallbacks.ContainsKey(id))
{
foreach (Action<T> callback in _selectIdCallbacks[id])
callback(data);
_selectIdCallbacks.Remove(id);
}
}
यह यूआई, DataManager, या WCF सेवा चैनल लॉक नहीं करता है, फिर भी अतिरिक्त की एक बहुत कुछ कोडिंग इसमें जाता है।
AsyncPatternWrapper हमारे आवेदन में परवाह किए बिना है। यह कुछ हमें Async WCF कॉल करने और एक कॉलबैक घटना
संपादित हम एक आवरण है जो हम यूआई धागे से उपयोग कर सकते हैं किसी भी DataManager कॉल रैप करने के लिए है सदस्यता के लिए अनुमति देता है। यह BackgroundWorker पर सिंक्रोनस विधि निष्पादित करता है, और परिणामों के विरुद्ध कॉलबैक निष्पादित करता है।
अतिरिक्त कोड का अधिकांश डेटामैनेजर और डब्ल्यूसीएफ सेवा चैनल को लॉक करना रोकने के लिए है।
नई सी # "async/प्रतीक्षा" सुविधा के सीटीपी रिलीज का मूल्यांकन करने पर विचार करें। यह इस तरह के कोड को लिखने के लिए डिज़ाइन किया गया है। एसिंक फ़ोरम पर आपकी प्रतिक्रिया प्राप्त करने में हमें खुशी होगी। http://msdn.microsoft.com/en-us/vstudio/async.aspx –
@Eric: धन्यवाद, मैं अब इसमें देख रहा हूं और अब तक मुझे यह पसंद है! – Rachel
@Eric: क्या आप मुझे डब्ल्यूसीएफ सेवा के साथ इसका उपयोग करने के बारे में किसी भी अच्छे ट्यूटोरियल/पैदल यात्रा की ओर इशारा कर सकते हैं? – Rachel