2010-11-19 12 views
1

WCF hizmetim için kolayca eşzamansız yöntemler oluşturmak istiyorum. Bunu yapmanın yolunun Begin/End eşzamansız kalıbını kullanması ve Begin metodumun AsyncPattern = true ile etiketlenmesi olduğunu biliyorum. Gerçekten benim kendi AsyncResult nesnemi kullanmam gerekip gerekmediğini merak ediyorum (ki bunu yapmaktan biraz endişeliyim) ya da bir olay işleyicisini kullanabiliyorsam ve esasen Başla/Son'ımı etkinlik işleyicisinin Başlangıç ​​/ Bitiş çağrısına kaydırıyorsam . Bu, bunu yapmanın yaklaşık bir yolu gibi görünüyor, ancak (bildiğim kadarıyla) olayı doğrudan WCF'den abone olamıyorum ya da davet edemiyorum, makul bir çözüm gibi görünüyor.AsyncResult'umu oluşturmak için bir olay kullanarak Başla/Sonu eşzamansız desen kısayolunu açabilir miyim?

private event EventHandler<RequestEventArgs> OnSendRequest; 

[OperationContract(AsyncPattern = true)] // Borrowed from the interface for this example 
public IAsyncResult BeginSendRequest(Request request, AsyncCallback callback, object state) 
{ 
    EventHandler<RequestEventArgs> handler = OnSendRequest; 
    if (handler != null) 
     return handler.BeginInvoke(this, new RequestEventArgs(request), callback, handler); 
    return null; 
} 

public void EndSendRequest(IAsyncResult result) 
{ 
    EventHandler<RequestEventArgs> handler = (EventHandler<RequestEventArgs>)result.AsyncState; 
    handler.EndInvoke(result); 
} 

Daha sonra, açıkça, bir şey olayı iş için abone olur. Ayrıca, BeginIn yöntemine iletilen nesne durumunu, olay işleyicisini devlet olarak geçirme lehine atacağım, böylece EndInvoke'u aramak için ona erişebildim.

Bu uygun bir seçenek midir? (AsyncResult nesnesinin ve asenkron programlamanın genel olarak nasıl çalıştığına dair bilgi ve anlayışım sınırlı.)

cevap

0

.NET için Reaktif Uzantılar (Rx). Bu, aradığınız desenin an implementation. Verilen example

:

var client = new WebClient(); 
var searchUri = new Uri("http://search.twitter.com/search.json?q=4sq.com"); 
var uploadUri = new Uri("http://localhost:8080/uploads"); 

IObservable<Unit> query = 
    from result in client.DownloadStringAsObservable(searchUri, new object()) 
    let transformed = TransformResult(result) 
    from upload in client.UploadStringAsObservable(
     uploadUri, 
     "POST", 
     transformed, 
     new object()) 
    select upload; 

var subscription = query.Subscribe(
    x => {}, // Nothing to do 
    exn => 
    { 
     // Do something with the exception 
    }, 
    () => 
    { 
     // Indicate we're finished 
    }); 
+0

sayesinde, bu benim programı için geçerli olan ilginç ama görünüyor. –

+0

Uygulandığı her yerde çalışır IObservable – AdamSane

+0

WCF bağlantılarını destekledikleri kutunun dışında. Bir web sitesinden indirmenin bir örneğini yayınladım. Kullanışlı bir WCF örneğim yok ama kod hemen hemen aynı. Sadece wcf client nesnesinde Abone ol, size (item, exception, finished) işleyicileri verecektir. Onlar da javascript için taşıdı. – AdamSane

0

Evet/ucunu başlamak desenli aynı şeyi yapıyorum. Bu şuna benzer: Ben bir JavaScript uç noktasına bir WCF hizmeti/WCF istemci geri arama uygulaması değil, bir web hizmeti yapıyorum olarak

public IAsyncResult BeginInsertWorkOrder(Dictionary<String, String> workOrderData, AsyncCallback callBack, Object state) 
{ 
    Action<Dictionary<String, String>> command = new Action<Dictionary<String, String>>(InsertWorkOrder); 
    return command.BeginInvoke(workOrderData, callBack, command); 
} 
İlgili konular