You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 4.0应用中如何将DataGrid选中行值作为WCF异步方法返回结果?

关于WCF异步方法返回DataGrid选中行值的问题解答

当然可以实现啦!不过要注意WCF异步方法的回调机制——默认情况下,异步方法完成时的回调参数里只有服务端返回的结果,所以我们需要想办法把你传入的val(也就是选中行的Id值)和回调逻辑关联起来,这里给你两种常用的实现方式:

方式一:利用闭包(Lambda表达式回调)

直接用lambda表达式作为回调方法,这样可以直接捕获当前方法中的val变量,在回调里就能直接使用这个值,无需额外传递:

private void btn_Click(object sender, RoutedEventArgs e)
{
    DataRowView rv = (DataRowView)dgData.SelectedItem;
    rv["TimeBeg"] = DateTime.Now.ToString("h:mm:ss");
    string val = rv["Id"].ToString();
    
    srAsync.ServClient clP = new srAsync.ServClient();
    // 用Lambda表达式作为回调,直接捕获val
    clP.MethodCompleted += (s, args) =>
    {
        // 这里既可以拿到服务端返回的结果args.Result,也能直接使用val
        if (args.Error == null)
        {
            // 比如把val作为结果的一部分处理
            Console.WriteLine($"服务端返回结果:{args.Result},传入的Id值:{val}");
        }
    };
    // 调用WCF异步方法,传入val
    clP.MethodAsync(val);
}

方式二:使用AsyncState传递额外状态

如果你的WCF生成的异步方法支持object state参数(部分版本的WCF异步代码生成会提供),可以把val作为状态参数传入,在回调里通过args.UserState获取:

private void btn_Click(object sender, RoutedEventArgs e)
{
    DataRowView rv = (DataRowView)dgData.SelectedItem;
    rv["TimeBeg"] = DateTime.Now.ToString("h:mm:ss");
    string val = rv["Id"].ToString();
    
    srAsync.ServClient clP = new srAsync.ServClient();
    clP.MethodCompleted += cl_MethodComplete;
    // 调用异步方法时传入val作为UserState
    clP.MethodAsync(val, val);
}

private void cl_MethodComplete(object sender, srAsync.MethodCompletedEventArgs e)
{
    if (e.Error == null)
    {
        // 从UserState中获取传入的Id值
        string val = e.UserState as string;
        Console.WriteLine($"服务端返回结果:{e.Result},传入的Id值:{val}");
    }
}

另外,如果你的需求是让WCF服务端直接返回这个val值,那只需要在服务端的方法里把传入的参数直接返回即可,比如服务端方法定义:

public string Method(string id)
{
    // 这里可以做其他业务逻辑,最后返回传入的id
    return id;
}

这样客户端异步回调的args.Result就会是你传入的val值了。

内容的提问来源于stack exchange,提问作者EvgenOrel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:48:05