2011-12-05 2 views
0

일부 이미지를 처리하는 프로세스를 시작하기 위해 webservice에 대한 호출을 사용합니다. 프로세스가 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

웹 서버에서 10 분 정도 걸리는 작업을해서는 안됩니다. 이를 위해 Windows 서비스를 작성해야합니다. 당신은 테이블에 레코드를 넣는 간단한 웹 서비스를 사용하여 윈도우 서비스가 작동하도록 할 수 있습니다. .

+0

실제로 웹 서버는 Windows 워크 플로 서비스로 구현됩니다. 그래서 저는 그것과 비슷한 것을한다고 생각합니다. 하지만 문제는 내가 비동기 메서드를 호출하고 서비스가 시작되지 않는다는 것입니다. – Ryan

+0

Gotcha, 그건 의미가 있습니다. 서비스를 시작하는 방법에 대한 정보를 제공 할 수 있습니다. – BNL

+0

비동기 호출을 수행하는 코드에서 – Ryan

0

나는 비동기 물건 클라이언트 측 그러나 서버 측을하지 않기 위하여 더 나은 방법을 생각한다. 응답을 무시할 때 호출이 서버에 도달했는지 알지 못하기 때문이다.

그런 식으로 서버 작업을 wirte하면 장기 실행 작업을 비동기로 시작한 다음 빠르게 반환합니다.

클라이언트는 호출을 대기 할 수 있으며 호출이 서버에 성공적으로 도착하고 작업이 시작되었음을 확신 할 수 있습니다.

+0

서비스에 대한 비동기 호출이 다른 워크 플로 서비스의 CodeActivity 내에서 수행되었습니다. 그래서 실제로 하나의 서비스를 호출하여 다른 서비스를 호출합니다. 이것은 ConvertToCubeService 서비스의 반환 값에 관심이 없기 때문에 비동기 호출을 사용하는 이유입니다. – Ryan

+0

예, 이해합니다. 그러나 서비스를 호출 할 때 두 가지 종류의 반환 값이 있습니다. 1) 호출이 성공적으로 전송되어 서버에 도달했다는 정보와 2) 작업의 실제 반환 값. 나는 당신이 비동기 패턴 서버 측을 사용할 때 얻을 수있는 첫번째 것을 기다리는 것이 더 좋다. – Jan

관련 문제