Fire和Forget(Asynch)ASP.NET方法调用

时间:2009-10-12 19:11:32

标签: c# asp.net asynchronous

我们有一项服务可以将客户信息更新到服务器。一次服务呼叫大约需要几秒钟,这是正常的。

现在我们有一个新页面,在一个实例中,可以更新大约35-50个Costumers信息。此时更改服务界面以接受所有客户是不可能的。

我需要调用一个方法(比如“ProcessCustomerInfo”),它将遍历客户信息并调用Web服务35-50次。异步调用服务并没有多大用处。

我需要异步调用方法“ProcessCustomerInfo”。我正在尝试使用 RegisterAsyncTask 。 Web上有各种示例,但问题是在我离开此页面后启动此调用后,处理将停止。

是否可以实现 Fire和忘记方法调用,以便用户可以从页面移开(重定向到另一个页面)而不停止方法处理?

5 个答案:

答案 0 :(得分:8)

详细信息:http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx

基本上你可以创建一个委托,它指向你想要异步运行的方法,然后用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
}

答案 1 :(得分:3)

这是我为此而鞭打的事情......


    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;
            }
        }
    }

然后

    new DoAsAsync(ProcessCustomerInfo).Execute();

还需要在Page指令<%@ Page Async="true" %>

中设置Async属性

我不确定这到底有多可靠,但它确实适用于我需要的东西。也许是一年前写的这个。

答案 2 :(得分:0)

我认为问题在于,您的Web服务期望客户端返回响应,服务调用本身不是单向通信。

如果您正在为您的网络服务使用WCF,请查看http://moustafa-arafa.blogspot.com/2007/08/oneway-operation-in-wcf.html进行单向服务呼叫。

我的两分钱: IMO无论谁将这个构造放在你身上,你都无法改变服务界面来添加新的服务方法,那就是提出无理要求的人。即使您的服务是公开使用的API,添加新的服务方法也不应影响任何现有的消费者。

答案 3 :(得分:0)

当然你can

答案 4 :(得分:0)