C#ASP.NET 3.5
是否有可能“触发并忘记”非异步或单向的Web服务中的方法?
有一种方法可以返回一个值(在一些处理之后),这是我不需要的。它由另一个组(编写服务的人)使用。基本上,它只是通知用户x做了动作y。我只需要调用方法并继续操作而不等待结果。
我尝试将BackgroundWorker()与RunWorkerAsync一起使用,但该方法由于某种原因不会触发。我无法更改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....
}
答案 0 :(得分: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....
}
答案 1 :(得分:1)
根据定义IS WCF OneWay请求的功能。完全无法在客户端实现所需的行为。
默认情况下,IIS(一个常见的WCF服务主机)可以杀死被关闭连接启动的任何进程。这意味着客户端必须在进程持续时间内保持连接(这实际上意味着等待结果)。此外,请求可能会超时并且“即发即弃”过程被终止。
如果您只想在请求处于运行状态时将客户端占用的资源减少到最少,我将异步运行请求。如果您只能访问.net< = 4.0,那么最简单的方法是使用“添加服务引用”选项生成异步调用(我的意思是APM async而不是async / await / TPL async)并勾选“生成异步方法“选项。
你还必须学习APM编程模型(非常讨厌)。
或者,您可以在单独的线程上运行WCF调用。但请注意,这会占用大量额外资源。
答案 2 :(得分:-1)
这里有关于Asysn / Sync wfc调用的文档。 http://msdn.microsoft.com/en-us/library/ms734701.aspx。