किसके लिए यह चिंता हो सकती है। डब्ल्यूसीएफ क्लाइंट बेस कम से कम इस कॉन्फ़िगरेशन में थ्रेड सुरक्षित हो सकता है। मैंने अन्य विन्यासों की कोशिश नहीं की।
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IWcfCallbacksContract), Namespace = "http://wcf.applicatin.srv/namespace")]
public interface IWcfContract
{
[OperationContract]
CompositeReturnObject GetServerObject();
}
सेवा:
public CompositeReturnObject GetServerObject()
{
CompositeReturnObject ret = new CompositeReturnObject("Hello");
Thread.Sleep(10000); // Simulating long call
return ret;
}
ग्राहक:
private void GetData_Click(object sender, RoutedEventArgs e)
{
Console.WriteLine("Task 1 start: " + DateTime.Now.ToString("HH:mm:ss"));
Task.Factory.StartNew(() => {
var res = _proxy.GetServerObject();
Console.WriteLine("Task 1 finish: " + DateTime.Now.ToString("HH:mm:s"));
Console.WriteLine(res.ToString());
return;
}
);
Thread.Sleep(2000);
Console.WriteLine("Task 2 start: " + DateTime.Now.ToString("HH:mm:ss"));
Task.Factory.StartNew(() => {
var res = _proxy.GetServerObject();
Console.WriteLine("Task 2 finish: " + DateTime.Now.ToString("HH:mm:s"));
Console.WriteLine(res.ToString());
return;
}
);
}
और परिणाम:
कार्य 1 शुरू: 15:47:08
कार्य 2 शुरू: 15 : 47: 10
कार्य 1 खत्म: 15:47:18
नाम: वस्तु एक "हैलो"
कार्य 2 खत्म: 15:47:20
नाम: एक वस्तु "हैलो"
स्रोत
2017-12-28 15:07:03
क्या है आपके सबूत या कहने का कारण यह है कि यह थ्रेड-सुरक्षित है? मैं पूछ रहा हूं क्योंकि [एमएसडीएन पर क्लाइंटबेस क्लास] का अंत (http://msdn.microsoft.com/en-us/library/ms576141%28v=vs.110%29.aspx) यह कहता है कि यह नहीं है सुरक्षित धागा। – ChrisW
@ChrisW: इसका अर्थ है कि 'क्लाइंटबेस' की गुणों का उपयोग करना थ्रेड सुरक्षित नहीं है लेकिन सेवा को कॉल करें (या यह दस्तावेज में एक बग हो सकता है - जो इतना दुर्लभ नहीं है)। सबसे पहले आप ग्राहक आधार के बिना कॉल कर सकते हैं - आपको केवल एक चैनल की आवश्यकता है। मेरे पास कोई सबूत नहीं है। मुझे विश्वास है कि रिमोट सेवा को कॉल करने के लिए किसी भी वैश्विक साझा डेटा को स्टोर करने की आवश्यकता नहीं है - अन्यथा डब्ल्यूसीएफ के पूरे ग्राहक पक्ष को बहुत खराब डिजाइन किया जाएगा। –
क्या आंतरिक 'चैनल' थ्रेड-सुरक्षित होना जाता है? मुझे कल्पना है कि एक चैनल के पास कुछ मेमोरी बफर और नेटवर्क सॉकेट है; और जब तक कि यह समवर्ती उपयोगकर्ताओं (जैसे उनके अनुरोधों को अनुक्रमित करके) का समर्थन करने के लिए स्पष्ट रूप से डिज़ाइन नहीं किया गया है, तो यदि दो मेमोरी और सॉकेट को एक साथ लिखने का प्रयास करते हैं तो यह विनाशकारी होगा। – ChrisW