C# - 通过 REF 从异步方法回调更新变量 - WebClient 类

Posted

技术标签:

【中文标题】C# - 通过 REF 从异步方法回调更新变量 - WebClient 类【英文标题】:C# - updating variable from async method callback BY REF - WebClient class 【发布时间】:2019-11-16 20:36:50 【问题描述】:

我想通过 WebClient 异步回调中的 ref 更新变量。

.DownloadStringAsync() (token) 中的第二个参数似乎不被 ref 接受,并且是 readonly (e.UserState) 所以我没有想法。

怎么做?

    static void Main(string[] args)
    
        string a = "AAA";
        using (WebClient wc = new WebClient())
        
            wc.DownloadStringCompleted += Wc_DownloadStringCompleted;
            wc.DownloadStringAsync(new Uri("http://someurl.to.json"), a);
        
        Console.ReadKey();
        Console.WriteLine(a);
    

    private static void Wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    
        // do something with e.result ...;
        // update the caller method's 'a' variable (by ref not possible as token) with "BBB"
    

【问题讨论】:

尝试将变量移动到全局范围内。 【参考方案1】:

作为documentation says,您应该使用System.Net.Http.HttpClient 而不是System.Net.WebClient(除非您使用的是非常旧的.NET 版本)。

使用HttpClient,这个任务很简单:

    static void Main(string[] args)
    
        string a;
        using (HttpClient client = new HttpClient())
        
            a = client.GetStringAsync("http://someurl.to.json").Result;
        
        Console.ReadKey();
        Console.WriteLine(a);
    

【讨论】:

【参考方案2】:

您可以使用DownloadStringTaskAsync 而不是DownloadStringAsync。

async static Task Main(string[] args)

    string a = "AAA";
    using (WebClient wc = new WebClient())
    
        wc.DownloadStringCompleted += Wc_DownloadStringCompleted;
        a = await wc.DownloadStringTaskAsync(new Uri("http://someurl.to.json"));
    
    Console.ReadKey();
    Console.WriteLine(a);


private static void Wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)

    // do something with e.result ...;
    // update the caller method's 'a' variable (by ref not possible as token) with "BBB"

如果你真的想使用DownloadStringAsync,你可能需要将你的变量设为全局变量。

或者甚至更好,使用 HttpClient 代替。 WebClient 和 HttpWebRequest 的东西现在已经过时了。

【讨论】:

以上是关于C# - 通过 REF 从异步方法回调更新变量 - WebClient 类的主要内容,如果未能解决你的问题,请参考以下文章

c# - 我应该使用“ref”通过引用方法来传递集合(例如列表)吗?

react ref和组件API

react ref和组件API

react ref和组件API

react ref和组件API

C# ref与out关键字区别