2011-12-05 2 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サービスを作成する必要があります。あなたはテーブルにレコードを入れて、Windowsサービスがその仕事をするようにするシンプルなWebサービスを持つことができます 。

+0

実際には、WebサーバーはWindowsワークフローサービスとして実装されています。だから私はそれがそれに似た何かをすると思います。しかし問題は私が非同期メソッドを呼び出して、サービスが開始しないということです。 – Ryan

+0

Gotcha、それは意味があります。どのようにサービスを開始しようとしているかについての情報を提供することができます。 – BNL

+0

非同期呼び出しを行うアクティビティからのコードを追加しました – Ryan

0

私はより良い方法は、非同期スタッフのクライアント側を行うのではなく、サーバー側であると考えています。応答を無視すると、呼び出しがサーバーに到達したかどうかわからないからです。

私はこのようにサーバー操作を実行し、長時間実行されているタスクを非同期で開始し、その後すぐに戻ります。

クライアントはコールを待つことができ、コールがサーバーに正常に到着し、操作が開始されたことを確認できます。

+0

サービスへの非同期呼び出しが別のワークフローサービスのCodeActivityから行われました。だから、実際に私はそれを目を覚ますために、別のサービスに電話しています。これは私がConvertToCubeServiceサービスの戻り値に興味がないので非同期呼び出しを使用する理由です – Ryan

+0

はい、わかります。しかし、サービスを呼び出すときには、2種類の戻り値があります。1)呼び出しが正常に送信され、サーバーに到達した情報、および2)操作の実際の戻り値。私は、非同期パターンサーバー側を使用するときに、最初に取得できるものを待つ方が良いと言います。 – Jan