3

C# ASP.NET 3.5

是否可以在非异步或单向的 Web 服务中“触发并忘记”一个方法?

有一种方法可以返回一个值(经过一些处理),我不需要。它被另一个组(谁编写了服务)使用。基本上,它只是通知用户 x 执行了操作 y。我只需要调用该方法并继续前进,而无需等待结果。

我尝试使用带有 RunWorkerAsync 的 BackgroundWorker(),但由于某种原因该方法没有触发。我无法更改 Web 服务方法,因为我无法访问他们的代码。我应该使用 BackgroundWorker、Invoke、ThreadPool 还是其他东西?我不需要返回的结果,也不需要知道它是否失败。基本上,调用该方法,如果它有效,那就太好了。如果没有,我不想停止或减慢处理速度。

public static void Test()
{
    var worker = new BackgroundWorker();
    worker.DoWork += Test2;
    worker.RunWorkerAsync(new object[] {12345, "test"});
}

private static void Test2(object sender, DoWorkEventArgs e)
{
   // Write to log that we got into the method - does not
   object[] args = e.Argument as object[];
   int num = Convert.ToInt32(args[0]);
   string name = (string)args[1];
   // call web service method here....
}
4

3 回答 3

1

使用后台工作人员可以尝试以下方法

    public static void Test()
    {
        System.Threading.ThreadPool.QueueUserWorkItem(delegate
        {
            Test2(new object[] { 12345, "test" });
        });
    }

    private static void Test2(object data)
    {
        // Write to log that we got into the method - does not
        object[] args = data as object[];
        int num = Convert.ToInt32(args[0]);
        string name = (string)args[1];
        // call web service method here....
    }
于 2013-04-18T02:56:20.680 回答
1

根据定义,请求的功能是 WCF OneWay。完全在客户端实现所需的行为是不可能的。

默认情况下,IIS(WCF 服务的公共主机)允许终止任何由关闭的连接启动的进程。这意味着客户端必须在整个过程中保持连接(这实际上意味着等待结果)。此外,请求可能会超时,并且“即发即弃”过程被终止。

如果您只想在请求进行时将客户端占用的资源减少到最低限度,我将异步运行请求。如果您只能访问 .net<=4.0,那么最简单的方法是使用“添加服务引用”选项生成异步调用(我的意思是 APM 异步而不是异步/等待/TPL 异步)并勾选“生成异步方法”选项。

您还必须学习 APM 编程模型(这很讨厌)。

或者,您可以在单独的线程上运行 WCF 调用。但请注意,这会使用大量额外资源。

于 2013-04-18T04:28:25.653 回答
-1

这里有一份关于 Asysn/Sync wfc 调用的文档。http://msdn.microsoft.com/en-us/library/ms734701.aspx

于 2013-04-18T02:10:40.320 回答