Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步实例化和调用WCF服务_C#_Linq_Wcf_Asynchronous_Async Await - Fatal编程技术网

C# 异步实例化和调用WCF服务

C# 异步实例化和调用WCF服务,c#,linq,wcf,asynchronous,async-await,C#,Linq,Wcf,Asynchronous,Async Await,我有一个助手方法,用于实例化WCF服务并执行操作。这对于同步调用来说非常有效,并且减少了我的主类中的代码。然而,我试图在对服务的异步调用上实现相同的方法,但在语法方面遇到了问题 这是我正在使用的助手方法: public static void Use(Action<T> action) { ChannelFactory<T> Factory = new ChannelFactory<T>("*"); Client

我有一个助手方法,用于实例化WCF服务并执行操作。这对于同步调用来说非常有效,并且减少了我的主类中的代码。然而,我试图在对服务的异步调用上实现相同的方法,但在语法方面遇到了问题

这是我正在使用的助手方法:

    public static void Use(Action<T> action)
    {
        ChannelFactory<T> Factory = new ChannelFactory<T>("*");
        ClientCredentials Credentials = new ClientCredentials();
        Credentials.UserName.UserName = USER_NAME;
        Credentials.UserName.Password = PASSWORD;
        Factory.Endpoint.EndpointBehaviors.Remove(typeof(ClientCredentials));
        Factory.Endpoint.EndpointBehaviors.Add(Credentials);
        T Client = Factory.CreateChannel();
        bool Success = false;

        try
        {
            action(Client);
            ((IClientChannel)Client).Close();
            Factory.Close();
            Success = true;
        }
        catch (CommunicationException cex)
        {
            Log.Error(cex.Message, cex);
        }
        catch (TimeoutException tex)
        {
            Log.Error(tex.Message, tex);
        }
        finally
        {
            if (!Success)
            {
                ((IClientChannel)Client).Abort();
                Factory.Abort();
            }
        }
    }
公共静态无效使用(操作)
{
ChannelFactory工厂=新的ChannelFactory(“*”);
ClientCredentials=新的ClientCredentials();
Credentials.UserName.UserName=用户名;
Credentials.UserName.Password=密码;
Factory.Endpoint.EndpointBehaviors.Remove(typeof(ClientCredentials));
Factory.Endpoint.EndpointBehaviors.Add(凭据);
T Client=Factory.CreateChannel();
布尔成功=假;
尝试
{
行动(客户);
((IClientChannel)Client.Close();
工厂关闭();
成功=真实;
}
捕获(通信异常cex)
{
日志错误(cex.Message,cex);
}
捕获(TimeoutException-tex)
{
日志错误(tex.Message,tex);
}
最后
{
如果(!成功)
{
((IClientChannel)Client.Abort();
Factory.Abort();
}
}
}
这是我从计时器已用事件对helper方法进行的同步调用:

    async void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Service<IVehicleService>.Use(client =>
        {
            Vehicles = client.GetAllVehicles(new GetAllVehiclesRequest()).vehicleList;
        });
        await UpdateVehicleStatuses();
    }
async void Timer\u已过(对象发送方,ElapsedEventArgs e)
{
Service.Use(客户端=>
{
Vehicles=client.GetAllVehicles(新的GetAllVehicleRequest()).vehicleList;
});
等待更新Hiclestatus();
}
这是调用GetVehicleStatus方法的地方:

    private async Task UpdateVehicleStatuses()
    {
        // Can the call to GetVehicleStatus be turned into a lambda expression utilizing the helper method?
        IEnumerable<Task<VehicleStatus>> StatusQuery = from s in Vehicles 
                                                       select GetVehicleStatus(s.ClientVehicleId);
        List<Task<VehicleStatus>> StatusTasks = StatusQuery.ToList();
        ...
     }
private异步任务updateHiclestStates()
{
//能否使用helper方法将对GetVehicleStatus的调用转换为lambda表达式?
IEnumerable StatusQuery=来自车辆中的
选择GetVehicleStatus(s.ClientVehicleId);
List StatusTasks=StatusQuery.ToList();
...
}
这是GetVehicleStatus方法的当前主体:

    private async Task<VehicleStatus> GetVehicleStatus(string clientVehicleID)
    {
        // Can this method be modified to use the helper method?
        GetStatusResponse Status = await VehicleClient.GetStatusByClientIdAsync(clientVehicleID);

        return Status.vehicleStatus;
    }
专用异步任务GetVehiclestStatus(字符串clientVehicleID)
{
//是否可以修改此方法以使用helper方法?
GetStatusResponse Status=等待车辆客户端。GetStatusByClientIdAsync(clientVehicleID);
返回状态。车辆状态;
}
我希望将同步调用中的相同主体应用于异步调用,这样我就不必在主类中初始化服务,并且可以封装那里的所有错误处理。我在尝试将GetVehicleStatus方法转换为UpdateHiclestatus方法中的lambda表达式时遇到语法问题。我还尝试修改GetVehicleStatus方法来利用helper方法,但没有成功。我错过了什么


谢谢

您需要助手方法的异步版本:

public static async Task UseAsync(Func<T, Task> action)
{
    ...
    try
    {
        await action(Client);
        ...
}
publicstaticasync任务UseAsync(Func操作)
{
...
尝试
{
等待行动(客户);
...
}
此外,如果需要支持返回值,则需要另一个重载:

public static async Task<TResult> UseAsync(Func<TClient, Task<TResult>> action)
{
    ...
    TResult result;
    try
    {
        result = await action(Client);
        ...
    return result;
}
publicstaticasync任务UseAsync(Func操作)
{
...
结果结果;
尝试
{
结果=等待行动(客户);
...
返回结果;
}
然后您可以这样使用它:

private async Task<VehicleStatus> GetVehicleStatusAsync(string clientVehicleID)
{
    GetStatusResponse Status = await UseAsync(client => client.GetStatusByClientIdAsync(clientVehicleID));

    return Status.vehicleStatus;
}
专用异步任务GetVehiclestStatusAsync(字符串clientVehicleID)
{
GetStatusResponse Status=await UseAncy(客户端=>client.GetStatusByClientIdAsync(clientVehicleID));
返回状态。车辆状态;
}

您需要助手方法的异步版本:

public static async Task UseAsync(Func<T, Task> action)
{
    ...
    try
    {
        await action(Client);
        ...
}
publicstaticasync任务UseAsync(Func操作)
{
...
尝试
{
等待行动(客户);
...
}
此外,如果需要支持返回值,则需要另一个重载:

public static async Task<TResult> UseAsync(Func<TClient, Task<TResult>> action)
{
    ...
    TResult result;
    try
    {
        result = await action(Client);
        ...
    return result;
}
publicstaticasync任务UseAsync(Func操作)
{
...
结果结果;
尝试
{
结果=等待行动(客户);
...
返回结果;
}
然后您可以这样使用它:

private async Task<VehicleStatus> GetVehicleStatusAsync(string clientVehicleID)
{
    GetStatusResponse Status = await UseAsync(client => client.GetStatusByClientIdAsync(clientVehicleID));

    return Status.vehicleStatus;
}
专用异步任务GetVehiclestStatusAsync(字符串clientVehicleID)
{
GetStatusResponse Status=await UseAncy(客户端=>client.GetStatusByClientIdAsync(clientVehicleID));
返回状态。车辆状态;
}

您需要助手方法的异步版本:

public static async Task UseAsync(Func<T, Task> action)
{
    ...
    try
    {
        await action(Client);
        ...
}
publicstaticasync任务UseAsync(Func操作)
{
...
尝试
{
等待行动(客户);
...
}
此外,如果需要支持返回值,则需要另一个重载:

public static async Task<TResult> UseAsync(Func<TClient, Task<TResult>> action)
{
    ...
    TResult result;
    try
    {
        result = await action(Client);
        ...
    return result;
}
publicstaticasync任务UseAsync(Func操作)
{
...
结果结果;
尝试
{
结果=等待行动(客户);
...
返回结果;
}
然后您可以这样使用它:

private async Task<VehicleStatus> GetVehicleStatusAsync(string clientVehicleID)
{
    GetStatusResponse Status = await UseAsync(client => client.GetStatusByClientIdAsync(clientVehicleID));

    return Status.vehicleStatus;
}
专用异步任务GetVehiclestStatusAsync(字符串clientVehicleID)
{
GetStatusResponse Status=await UseAncy(客户端=>client.GetStatusByClientIdAsync(clientVehicleID));
返回状态。车辆状态;
}

您需要助手方法的异步版本:

public static async Task UseAsync(Func<T, Task> action)
{
    ...
    try
    {
        await action(Client);
        ...
}
publicstaticasync任务UseAsync(Func操作)
{
...
尝试
{
等待行动(客户);
...
}
此外,如果需要支持返回值,则需要另一个重载:

public static async Task<TResult> UseAsync(Func<TClient, Task<TResult>> action)
{
    ...
    TResult result;
    try
    {
        result = await action(Client);
        ...
    return result;
}
publicstaticasync任务UseAsync(Func操作)
{
...
结果结果;
尝试
{
结果=等待行动(客户);
...
返回结果;
}
然后您可以这样使用它:

private async Task<VehicleStatus> GetVehicleStatusAsync(string clientVehicleID)
{
    GetStatusResponse Status = await UseAsync(client => client.GetStatusByClientIdAsync(clientVehicleID));

    return Status.vehicleStatus;
}
专用异步任务GetVehiclestStatusAsync(字符串clientVehicleID)
{
GetStatusResponse Status=await UseAncy(客户端=>client.GetStatusByClientIdAsync(clientVehicleID));
返回状态.ve