2011-12-05 15 views
0

我使用對web服務的調用來喚醒處理某些圖像的進程。 該過程需要10分鐘,所以我不希望asp.net客戶端等待。當您對響應不感興趣時​​,使用異步調用webservice

我所做的只是一個簡單的異步調用服務來啓動處理。

但它看起來像ConvertToCubeService服務不打擾啓動。 ConvertToCubeService是一個工作流服務。我從另一個工作流服務的活動中調用它。 我確信代碼會將異步調用傳遞給ConvertToCubeService。

public sealed class CallProcessingAsync : CodeActivity 
{ 
    // Define an activity input argument of type string 
    public InArgument<string> EquirectangularImagePath { get; set; } 
    public InArgument<string> SaveImageDirectoryPath { get; set; } 
    public InArgument<string> ImageName { get; set; } 
    // If your activity returns a value, derive from CodeActivity<TResult> 
    // and return the value from the Execute method. 
    protected override void Execute(CodeActivityContext context) 
    { 
     // Obtain the runtime value of the Text input argument 
     ConvertToCubeService.ServiceClient client = new ConvertToCubeService.ServiceClient(); 
     ConvertToCubeService.ConvertToCubeFaces param = new ConvertToCubeService.ConvertToCubeFaces(); 

     var apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; 


     param.EquirectangularFilePath=apPath+context.GetValue(this.EquirectangularImagePath); 
     param.imageName = context.GetValue(this.ImageName); 
     param.SaveCubicFacesDirectory = apPath + context.GetValue(this.SaveImageDirectoryPath); 
     client.ConvertToCubeFacesCompleted += new EventHandler<ConvertToCubeService.ConvertToCubeFacesCompletedEventArgs>(client_ConvertToCubeFacesCompleted); 
     client.ConvertToCubeFacesAsync(param);//call async the server to do the work 
     using (var db = new panonestEntities()) 
     { 
      var p = db.Panoramas.Where(x => x.ImageName.Equals(param.imageName)).First(); 
      p.Status = "Called processing. wait"; 
      db.SaveChanges(); 
     } 
    } 

    void client_ConvertToCubeFacesCompleted(object sender, ConvertToCubeService.ConvertToCubeFacesCompletedEventArgs e) 
    { 
     using (var db = new panonestEntities()) 
     { 

     } 
    } 
} 

回答

0

您不應該在Web服務器上運行需要10分鐘的東西。你應該爲此寫一個windows服務。您可以有一個簡單的web服務,將一條記錄放入一個表中,以觸發windows服務執行其工作 。

+0

實際上,Web服務器是作爲Windows工作流服務實現的。所以我認爲它做了類似的事情。但問題是,我打電話的異步方法和服務不啓動.. – Ryan

+0

嘿,這是有道理的。您可能想要提供有關如何嘗試啓動該服務的信息。 – BNL

+0

我添加了使Async調用 – Ryan

0

我認爲更好的方式是不會做的東西異步客戶端服務器,但身邊,因爲當你忽略的反應,你不會知道,如果呼叫甚至已經達到了服務器。

我會WIRTE以這種方式,服務器正常運行,它啓動了長時間運行的異步任務,然後返回快。

客戶端可以等待呼叫,可以肯定的是,呼叫到達成功的服務器,並開始操作。

+0

異步調用服務的活動中的代碼是從另一個Workflow服務的CodeActivity中完成的。所以實際上我有一個叫另一個的服務,只是爲了喚醒它。這就是爲什麼我使用Async調用,因爲我對ConvertToCubeService服務的返回值不感興趣。 – Ryan

+0

是的,我明白了。但是在調用服務時,您有兩種返回值:1)信息,調用已成功傳輸併到達服務器,以及2)操作的實際返回值。我說當你使用異步模式服務器端時,最好等待你能得到的第一個。 – Jan