मैं System.Net.WebSocket के लिए एक एक्सटेंशन विधि लिखने की कोशिश कर रहा हूं जो इसे प्रतिक्रियाशील एक्सटेंशन (Rx.NET) का उपयोग करके IObserver में बदल देगा। आप नीचे दिए गए कोड देख सकते हैं:IObserver को async/onEext/OnError/OnCompleted विधियों का इंतजार कैसे करें?
public static IObserver<T> ToObserver<T>(this WebSocket webSocket, IWebSocketMessageSerializer<T> webSocketMessageSerializer)
{
// Wrap the web socket in an interface that's a little easier to manage
var webSocketMessageStream = new WebSocketMessageStream(webSocket);
// Create the output stream to the client
return Observer.Create<T>(
onNext: async message => await webSocketMessageStream.WriteMessageAsync(webSocketMessageSerializer.SerializeMessage(message)),
onError: async error => await webSocketMessageStream.CloseAsync(WebSocketCloseStatus.InternalServerError, string.Format("{0}: {1}", error.GetType(), error.Message)),
onCompleted: async() => await webSocketMessageStream.CloseAsync(WebSocketCloseStatus.NormalClosure, "Server disconnected")
);
}
इस कोड काम करता है, लेकिन मैं async के उपयोग के बारे में चिंतित हूं/onNext, onError के अंदर का इंतजार है, और lambdas onCompleted। मुझे पता है कि यह एसिंक शून्य लैम्ब्डा लौटाता है, जो कि (और कभी-कभी ऐसे मुद्दों का कारण बनता है जिन्हें मैंने पहले ही चलाया है)।
मैं आरएक्स.नेट दस्तावेज के साथ-साथ इंटरनेट पर ब्लॉग पोस्ट पर पढ़ रहा हूं और मुझे IObserver में एसिंक/प्रतीक्षा विधि का उपयोग करने के लिए उचित तरीका (यदि कोई है) नहीं मिल रहा है। क्या ऐसा करने का कोई सही तरीका है? यदि नहीं, तो मैं इस समस्या के आसपास कैसे काम कर सकता हूं?
आपकी धारणाएं गलत हैं। असल में, आप 'Func>' (या कुछ संस्करण जो पैरामीटर लेते हैं) को 'onNext' आदि पर पास कर रहे हैं। प्रतिनिधियों के पास' शून्य 'रिटर्न प्रकार नहीं हैं। वे कार्य वापस करते हैं। –
spender
मुझे यकीन नहीं है कि मैं आपका अनुसरण करता हूं। मैं इस तरह की क्रिया के लिए एसिंक विधि असाइन कर सकता हूं: एक्शन टेस्ट = async() => DoSomethingAsync() का इंतजार है; यह सिर्फ ठीक है और "परीक्षण" कार्रवाई का इंतजार नहीं है। कॉलिंग टेस्ट() तुरंत लौटाता है और DoSomethingAsync() पूरा होने से पहले। Observer.Create() के लिए विधि परिभाषा क्रियाओं को आगे, ऑनर, और पूर्ण पर पैरा के रूप में स्वीकार करती है। यही कारण है कि मैंने ऊपर पोस्ट किया गया कोड काम करता है। हालांकि, जब कोई मेरे IObserver पर OnNext (x) को कॉल करता है, तो यह लौटने से पहले विधि के एसिंक्रोनस भाग को समाप्त करने की प्रतीक्षा नहीं करता है। –
ओह। मेरी गलती। अब इसमें देख रहे हैं। – spender