将异步任务中声明的变量带到不同的类

Posted

技术标签:

【中文标题】将异步任务中声明的变量带到不同的类【英文标题】:bring variable declared inside async task to different class 【发布时间】:2020-08-07 09:45:50 【问题描述】:

我已经使用 newtonsoft.json 和 HttpClient 提取了一些信息:

public class Main 
    static async Task Main() 
        using(var client = new HttpClient() 
            url = "webapilink goes here";
            var response = await client.GetStringAsync(url);
            apiStuff(the class i used to match the JSON format) variableName = 
                  JsonConvert.DeserializeObject<apiStuff>(response);
        
    

我想将变量“variableName”放到一个单独的类中,而对于我的生活,我无法弄清楚。尝试在 HttpClient 部分之外的任何地方使用它时出现错误。

【问题讨论】:

类不做任何事情,除非你调用一个方法。方法接受参数。例如,您可以将variableName 作为参数传递给类的方法(或其构造函数)。 您能否澄清一下“将变量 'variableName' 分配给单独的类”的结果?真的看不出将变量转换为类意味着什么...... 你可能正在寻找这个:docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 您需要重新访问 C# 中的范围...在方法内声明的任何内容都无法在该方法之外访问...这也适用于块范围...我建议您通过一些参数Main(ref apiStuff variableName)...,然后在该方法中使用它...然后在您将使用此Main 方法的其他类中声明variableName... 这不能返回你想要的变量吗?在 async/await 模式中,即static async Task&lt;apiStuff&gt; Main() ... do code ...; return variableName; 。如果你不需要,没有理由使用ref 【参考方案1】:

如前所述,如果您的异步方法不是异步的,它将返回 void。但是可以重写它以返回apiStuff 的实例,以便其他方法(和其他类)可以获取apiStuff 的实例并使用它:

using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;

public class MainClass

    public static async Task<apiStuff> Main()
    
        using (var client = new HttpClient())
        
            string url = "webapilink goes here";
            var response = await client.GetStringAsync(url);
            apiStuff variableName =
                  JsonConvert.DeserializeObject<apiStuff>(response);
            return variableName;
        
    


public class SecondClass

    public static async Task GetApiStuff()
    
        apiStuff variableName = await MainClass.Main();
        // do more work with variableName
    


public class apiStuff  /* defined elsewhere */ 

如果这不是您要问的,请在原始问题中澄清。 (而且我假设该方法并没有真正命名为 Main - 可能会令人困惑。)

【讨论】:

以上是关于将异步任务中声明的变量带到不同的类的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin - 覆盖函数中的 iOS 异步任务

向异步任务发送意图

如何使用界面更新异步任务中的进度条

如何将异步任务用于不同的值。我将在描述中简要解释我的问题

7.4 异步定时和邮件发送任务

Android取消多次调用的异步任务