C# 激发并忘记(异步)ASP.NET方法调用

C# 激发并忘记(异步)ASP.NET方法调用,c#,asp.net,asynchronous,C#,Asp.net,Asynchronous,我们提供一项服务,将客户信息更新到服务器。一个服务呼叫大约需要几秒钟,这是正常的 现在我们有了一个新的页面,其中一个实例可以更新大约35-50个客户的信息。此时,更改服务接口以同时接受所有客户是毫无疑问的 我需要调用一个方法(比如“ProcessCustomerInfo”),该方法将遍历客户信息并调用web服务35-50次。异步调用服务没有多大用处 我需要异步调用方法“ProcessCustomerInfo”。我正在尝试为此使用RegisterAsyncTask。web上有各种可用的示例,但问题

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

现在我们有了一个新的页面,其中一个实例可以更新大约35-50个客户的信息。此时,更改服务接口以同时接受所有客户是毫无疑问的

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

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


是否可以实现Fire-and-Forget方法调用,这样用户就可以在不停止方法处理的情况下离开页面(重定向到另一个页面?

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

如果您在Web服务中使用WCF,请查看如何进行单向服务调用

我的两分钱:IMO无论是谁,如果你认为你不能通过改变服务接口来添加新的服务方法,那就是提出不合理要求的人。即使您的服务是公开使用的API,添加新的服务方法也不会影响任何现有消费者。

当然。

有关以下内容的详细信息:

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

这是我鞭打的东西只是为了这么做


    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();
还需要在页面指令


我不确定这到底有多可靠,但它确实为我所需要的工作。大概一年前写的。

我想你想要的是一个真正的背景线程:


问题不是从服务获得响应,而是呼叫服务50次。在这里,对服务的单向调用对我没有帮助,我需要找到调用实际进行服务调用的方法的方法。。。。。。。更改接口是一个问题,因为此服务已被其他供应商公开,他们目前不愿意更改。单向服务调用将解决您的问题,您不需要异步触发它们,因为它们会打开请求、触发数据并关闭连接,当您点击submit或您的页面所做的任何操作时,它会在一秒钟内完成并完成。但是,如果您不拥有该服务,则无法将其更改为单向。谢谢。这是我目前正在尝试的方法。但问题是电影远离了页面。如果用户单击任何链接以转到另一个页面,异步处理也会停止。@ExpertSoul-更改页面时,异步处理似乎不太可能停止,因为根据链接到的文档Restuta,异步任务必须在呈现页面之前完成(在交付到浏览器之前)。您是否记得添加带有Async=“true”属性的页面指令或将页面的AsyncMode属性设置为“true”?有些东西告诉我,您的异步任务可能根本没有执行。@paper1337-只是再次验证了一下。使用Redirection语句,调用“OnBegin”方法,但操作超时,因此返回页面。但OnBegin一直处理到end。使用重定向语句(我将其放在异步方法调用之后),永远不会调用“OnBegin”。另外,虽然到处都提到指定属性Async=“true”,但我没有看到有或没有它在处理过程中有任何不同。谢谢Joel!我在前面看到过这个方法,但由于MethodInvoker是System.Windows.Form的一部分而被忽略。虽然我需要做更多的测试,但重定向似乎工作得很好。但是我应该在ASP.NET中使用此方法吗?或者有其他的网络替代方案吗?哦,是的,很抱歉。使用ASP.NET可以很好地工作,但如果您不必在项目中包含System.Windows.Form,那将是一件很遗憾的事情。相反,您可以创建自己的委托,并使用它代替MethodInvoker。我已经更新了上面的代码示例。MethodInvoke只是一个已经为您创建的委托,没有参数或返回值,因此您不必花时间创建自己的委托。我们刚刚创建的ProcessCustomerInfoDelegate的工作方式与此完全相同。有人讨论了在没有EndInvoke的情况下调用BeginInvoke是否是一个坏主意—主要是因为不对某些委托调用EndInvoke操作可能会导致内存泄漏。我建议您使用ThreadPool.QueueUserWorkItem(cb=>ProcessCustomerInfo())代替我真正喜欢的解决方案。有没有任何更新或新发现的陷阱,因为你似乎已经使用了一段时间了?我不记得有问题。当这个答案已经在生产中使用时,它仍然存在/耸肩