我使用对Web服务的调用来唤醒处理某些图像的进程。 这个过程需要10分钟,所以我不希望asp.net客户端等待它。
我所做的是对服务进行简单的异步调用以启动处理。
但看起来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 :(得分:0)
您不应该在Web服务器上运行需要10分钟的事情。你应该为此编写一个Windows服务。您可以使用一个简单的Web服务,将记录放入表中以触发Windows服务执行其工作
答案 1 :(得分:0)
我认为更好的方法不是做异步客户端而是服务器端,因为当你忽略响应时,你不会知道呼叫是否已经到达服务器。
我会以这种方式处理服务器操作,它会异步启动长时间运行的任务,然后快速返回。
客户端可以等待呼叫,并且可以确定呼叫已成功到达服务器并且操作已开始。