2009-10-12 10 views
7

Mamy usługę aktualizacji informacji o klientach na serwer. Jedna rozmowa serwisowa trwa kilka sekund, co jest normalne.Ogień i zapomnij (Asynch) Wywołanie metody ASP.NET

Teraz mamy nową stronę, gdzie w jednym przypadku około 35-50 Informacje o klientach mogą być aktualizowane. Zmiana interfejsu serwisowego w celu akceptacji wszystkich klientów nie wchodzi w rachubę.

Potrzebuję wywołać metodę (np. "ProcessCustomerInfo"), która będzie wyświetlać informacje o kliencie i wywoływać serwis WWW 35-50 razy. Wywołanie usługi asynchronicznie nie jest zbyt użyteczne.

Muszę asynchronicznie wywołać metodę "ProcessCustomerInfo". Próbuję użyć do tego celu RegisterAsyncTask. W Internecie dostępne są różne przykłady, ale problem występuje po zainicjowaniu tego połączenia, jeśli odejdę od tej strony, przetwarzanie zostanie przerwane.

Czy można zrealizować wywołanie metody Fire and Forget, aby użytkownik mógł odejść (Przekierowanie na inną stronę) ze strony bez zatrzymywania przetwarzania metody?

Odpowiedz

8

Szczegóły na: http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx

Zasadniczo można utworzyć delegata, który wskazuje na metodę, którą chcesz uruchomić asynchronicznie i następnie kopnąć go z BeginInvoke.

// Declare the delegate - name it whatever you would like 
public delegate void ProcessCustomerInfoDelegate(); 

// Instantiate the delegate and kick it off with BeginInvoke 
ProcessCustomerInfoDelegate d = new ProcessCustomerInfoDelegate(ProcessCustomerInfo); 
simpleDelegate.BeginInvoke(null, null); 

// The method which will run Asynchronously 
void ProcessCustomerInfo() 
{ 
    // this is where you can call your webservice 50 times 
} 
+0

Dzięki Joel! Widziałem tę metodę wcześniej, ale ignorowałem, ponieważ MethodInvoker jest częścią System.Windows.Form. Wydaje się, że działa dobrze z Przekierowaniem, chociaż muszę wykonać więcej testów. Ale czy powinienem używać tej metody dla ASP.NET? Czy istnieje alternatywa dla tego Web? – BinaryHacker

+0

Ups, przepraszam za to. To by działało dobrze z ASP.NET, ale byłoby wstyd, gdyby trzeba włączyć System.Windows.Form do projektu, jeśli nie musisz. Zamiast tego możesz utworzyć własnego delegata i użyć go zamiast metody MethodInvoker. Zaktualizowałem próbkę kodu powyżej. –

+1

MethodInvoke jest już tylko delegatem dla ciebie bez parametrów lub wartości zwracanych, dzięki czemu nie musisz poświęcać czasu na tworzenie własnych. ProcessCustomerInfoDelegate, który właśnie stworzyliśmy, działa dokładnie w ten sam sposób. –

0

Uważam, że problem polega na tym, że Państwa usługa sieciowa oczekuje od klienta odpowiedzi, że sama usługa nie jest komunikacją jednokierunkową.

Jeśli korzystasz z funkcji WCF dla swoich usług internetowych, spójrz na numer http://moustafa-arafa.blogspot.com/2007/08/oneway-operation-in-wcf.html, aby wykonać jednodrożną rozmowę serwisową.

Moje dwa centy: IMO kto umieścić konstrukt Ci, że nie jesteś w stanie zmienić interfejs usługi, aby dodać nową metodę usługi jest jeden podejmowania nieuzasadnionych żądań. Nawet jeśli twoja usługa jest publicznie konsumowanym API, dodanie nowej metody obsługi nie powinno mieć wpływu na obecnych klientów.

+0

Problem nie jest uzyskanie odpowiedzi od służby, ale wywołanie usługi 50 razy.Jednokierunkowe połączenie z serwisem nie pomoże mi tutaj, muszę znaleźć sposób na wywołanie metody, która w rzeczywistości wywołuje zgłoszenia serwisowe ....... Zmiana interfejsu jest problemem, ponieważ ta usługa jest udostępniana przez innego dostawcę i w tej chwili nie chcą tego zmienić. – BinaryHacker

+0

Jednokierunkowe zgłoszenie serwisowe rozwiąże Twoje problemy, nie będziesz musiał uruchamiać ich wszystkich asynchronicznie, ponieważ otwierają one swoje żądanie, uruchamiają dane i zamykają połączenie, które po kliknięciu przesyłaj lub cokolwiek robi Twoja strona, która właśnie się kończy. sekundę i gotowe. jednak jeśli nie jesteś właścicielem usługi, nie możesz jej zmienić na 1. –

0

Na pewno jesteś can.

+0

Dzięki. To jest metoda, którą próbuję obecnie. Ale problemem jest film z dala od strony. Jeśli użytkownik kliknie dowolne łącze, aby przejść do innej strony, przetwarzanie asynchroniczne również się zatrzymuje. – BinaryHacker

+0

@ExpertSoul - wydaje się mało prawdopodobne, że przetwarzanie asynchroniczne zatrzyma się podczas zmiany stron, ponieważ zgodnie z dokumentem Restuta połączonym z, asynchroniczne zadania muszą zostać wykonane przed renderowaniem strony (zanim zostanie ona dostarczona do przeglądarki). Czy pamiętasz, aby dodać dyrektywę Strona z atrybutem Async = "true" lub ustawić właściwość AsyncMode strony na "true"? Coś mi mówi, że twoje asynchroniczne zadania mogą w ogóle nie być wykonywane. –

+0

@ paper1337 - właśnie to zweryfikowałem. Z instrukcją Przekierowanie wywoływana jest metoda "OnBegin", ale operacja kończy się, więc wraca do strony. Ale OnBegin jest przetwarzany do końca. Z instrukcją przekierowania (którą umieściłem tuż po wywołaniu metody asynchronicznej) "OnBegin" nigdy nie jest wywoływany. Ponadto, chociaż wszędzie wspomniano o właściwości Async = "true", nie widzę żadnej różnicy w przetwarzaniu z lub bez niego. – BinaryHacker

3

To było coś, co po prostu bita to zrobić ...


    public class DoAsAsync 
    { 
     private Action action; 
     private bool ended; 

     public DoAsAsync(Action action) 
     { 
      this.action = action; 
     } 

     public void Execute() 
     { 
      action.BeginInvoke(new AsyncCallback(End), null); 
     } 

     private void End(IAsyncResult result) 
     { 
      if (ended) 
       return; 

      try 
      { 
       ((Action)((AsyncResult)result).AsyncDelegate).EndInvoke(result); 
      } 
      catch 
      { 
       /* do something */ 
      } 
      finally 
      { 
       ended = true; 
      } 
     } 
    } 

A potem

new DoAsAsync(ProcessCustomerInfo).Execute();

Należy również ustawić właściwość Async w dyrektywie Page <%@ Page Async="true" %>

Nie jestem pewien, jak dokładnie jest to wiarygodne, jednak zadziałało to, czego potrzebowałem. Napisałem to może rok temu.

+0

Naprawdę podoba mi się to rozwiązanie. Czy są jakieś aktualizacje lub nowo znalezione gry, ponieważ pozornie używasz tego od jakiegoś czasu? –

+0

Nie przypominam sobie, że mam z tym problemy. Kiedy ta odpowiedź była już używana w produkcji, wciąż jest. /wzruszać ramionami – Dave

Powiązane problemy