【问题标题】:string undefined after async c#异步 c# 后字符串未定义
【发布时间】:2016-01-11 23:16:37
【问题描述】:

我正在自学 C#,这很有趣,但我一直在尝试找到解决此问题的示例,但我没有找到任何示例(可能是因为我不熟悉如何搜索此问题)。

我下面贴的代码有一个问题:

当尝试将项目添加到 List 时,它使用仍未定义的字符串,因为定义这些字符串的部分正在异步工作,因此它不会及时执行。有问题的代码部分是“DataSource.Add(new Data4TheGrid(){...});”接近代码的末尾。它在 RestRequest 响应来定义这些变量之前运行。

public class Data4TheGrid
{
    public string Data { get; set; }
    public string Aa { get; set; }
    public string Ab { get; set; }
    public string Ac { get; set; }
    public string Ad { get; set; }
    public string Ae { get; set; }
    public string Af { get; set; }
    public string Ag { get; set; }
}

public async void FindData(string mes, string ano)
{
    string[] vendedores = { "aa", "ab", "ac", "ad", "ae", "af", "ag" };
    Uri BaseUrl = new Uri("http://example.com/rest.asmx");
    var today = DateTime.Today;
    var hjDia = today.Day;
    var hjMes = today.Month;
    var hjAno = today.Year;
    var DataSource = new List<Data4TheGrid>();

    if (hjMes.ToString() == mes && hjAno.ToString() == ano)
    {
        var varDia = 1;
        while (varDia <= hjDia)
        {
            string aa;
            string ab;
            string ac;
            string ad;
            string ae;
            string af;
            string ag;
            foreach (var vendedor in vendedores)
            {
                var client = new RestClient(BaseUrl);
                var request = new RestRequest("/DayValue", Method.POST);
                request.RequestFormat = DataFormat.Json;
                request.AddBody(new { dia = Convert.ToString(varDia), mes = mes, ano = ano, vendedor = vendedor });
                var restResponse = await client.ExecuteTaskAsync(request);
                JsonResponse fstResp = JsonConvert.DeserializeObject<JsonResponse>(restResponse.Content);
                dValue dValue = JsonConvert.DeserializeObject<dValue>(fstResp.d);
                string valorDia = Convert.ToDecimal(dValue.Valor).ToString("c2");
                switch (vendedor)
                {
                    case "aa":
                        aa = valorDia;
                        break;
                    case "ab":
                        ab = valorDia;
                        break;
                    case "ac":
                        ac = valorDia;
                        break;
                    case "ad":
                        ad = valorDia;
                        break;
                    case "ae":
                        ae = valorDia;
                        break;
                    case "af":
                        af = valorDia;
                        break;
                    case "ag":
                        ag = valorDia;
                        break;
                }
            }
            DataSource.Add(new Data4TheGrid()
            {
                Data = varDia + "/" + today.ToString("MM/yyyy"),
                Aa = aa,
                Ab = ab,
                Ac = ac,
                Ad = ad,
                Ae = ae,
                Af = af,
                Ag = ag
            });
            }
            varDia++;
    }
    dataGridView1.DataSource = DataSource;
}

问题:如何在同一方法中制作一部分代码以等待另一部分代码首先在异步方法上运行? (至少这是我认为可以完成这项工作的一种解决方案)。

【问题讨论】:

    标签: c# asynchronous


    【解决方案1】:

    改变

    public async void FindData(string mes, string ano)
    

    public async Task FindData(string mes, string ano)
    

    在此处参考类似问题: How to wait for async method to complete?

    【讨论】:

    • 这会是唯一需要的改变吗?我猜不是,但我无法弄清楚我需要改变什么。我应该将 FindData 分解成更多方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2021-11-17
    相关资源
    最近更新 更多