C # - обновление переменной из обратного вызова асинхронного метода BY REF - класс WebClient - PullRequest
2 голосов
/ 06 июля 2019

Я хотел бы обновить переменную по ref внутри асинхронного обратного вызова WebClient.

похоже, что 2-й параметр в .DownloadStringAsync() (токен) не принимает 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"
    }

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Вы можете использовать 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 уже устарели.

0 голосов
/ 06 июля 2019

Как указано в документации , вы должны использовать 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);
    }
...