ASP.NET Web 窗体 - 如何异步调用 WCF 异步方法?



我创建了一个 WCF 服务并将其托管在 IIS 中。 我可以通过在 asp.net Web 窗体应用程序中创建 Web 引用来访问 WCF 服务。 我需要让 WCF Web 服务运行长时间运行的方法(异步)。 是否有人有很好的示例代码来说明如何从 asp.net Web 窗体应用程序按钮单击方法调用 WCF 异步方法?

我看过IAsyncResult,EAP和TAP... 当前从 ASP.NET Web 窗体应用程序对 WCF 异步方法进行异步调用的最佳方法是什么?

我现在确实将代码更改为使用服务引用而不是 Web 引用。

服务收据页脚服务(服务合同,运营合同,数据合同):

using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Threading.Tasks;
namespace ReceiptFooterDeploymentService
{
[ServiceContract]
public interface IReceiptFooterService
{
[OperationContract(Name = "GetRegisterPingResults")]
Task<List<PingReply>> GetRegisterPingResults(List<StoreIP> potentialIPs);
}
[DataContract]
public class StoreIP
{
private int _storeNumber;
private string _ipAddress;
[DataMember]
public int StoreNumber
{
get
{
return _storeNumber;
}
set
{
_storeNumber = value;
}
}
[DataMember]
public string IPAddress
{
get
{
return _ipAddress;
}
set
{
_ipAddress = value;
}
}
}
}

收据页脚服务类:

using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Threading.Tasks;
namespace ReceiptFooterDeploymentService
{
public class ReceiptFooterService : IReceiptFooterService
{
public async Task<List<PingReply>> GetRegisterPingResults(List<StoreIP> potentialIPs)
{
var tasks = potentialIPs.Select(sip => new Ping().SendPingAsync(sip.IPAddress, 1000));
var results = await Task.WhenAll(tasks);
return results.ToList();
}
}
}

ASP.NET Web 表单客户端:仅方法的前几行(为简洁起见)

private List<StoreDetail> PingStoreAndUpdateStatus(List<StoreDetail> storeDetails)
{
ReceiptFooterService.StoreIP[] potentialIPs = GetStoreRegisterIps(storeDetails).ToArray();
ReceiptFooterService.ReceiptFooterServiceClient client = new ReceiptFooterService.ReceiptFooterServiceClient();
List<PingReply> pingReplies = client.GetRegisterPingResultsAsync(potentialIPs).Result.ToList();

我正在尝试异步 ping 大约 2000 个 IP 地址。 我得到了四个显示成功的结果。 虽然,没有显示其他PingReply详细信息。 我需要知道 ping 了什么 IP 地址。

我应该在某个地方等待...这就是它很快恢复的原因,还是有错误导致它失败。 任何建议将不胜感激。

下面是我的结果的快速观看:

首先,在使用 WCF 时,为什么不使用服务引用? (网络与服务参考) 然后,在使用 SOAP 客户端时,它会自动生成具有同步和asynchronous变体的每个方法的 SOAP WCF 客户端。
然后你只需调用这个异步方法

MyServiceClient.DummyMethodAsync(someParameters...)

我发现使用 WCF Web 服务来完成我需要执行的异步工作(在 Web 服务中不起作用)。

我切换到创建一个使用参数调用的控制台应用程序,然后将结果存储在数据库中。 然后,我让网站访问存储在数据库中的结果。

控制台应用程序上下文对于完成我想同时运行的异步方法数量要友好得多。

最新更新