winforms 如何等待任务获取文件?

ef1yzkbh  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(115)
private async Task GetImagesFiles(string radarImagesFolder)
        {
            DirectoryInfo lastRadarWrittenFolder = null;

            var tt = new DirectoryInfo(textBoxRadarPath.Text).GetDirectories();
            if (tt.Length > 0)
            {
                lastRadarWrittenFolder = new DirectoryInfo(textBoxRadarPath.Text).GetDirectories()
                   .OrderBy(d => d.CreationTimeUtc).First();
            }

            if (Directory.Exists(radarImagesFolder) && tt.Length > 0)
            {
               radarImages = Directory.GetFiles(lastRadarWrittenFolder.FullName, "*.png");
            }
        }

使用它

private async void Completed(object sender, AsyncCompletedEventArgs e, Stopwatch sw, string urlAddress)
{
  await GetImagesFiles(textBoxRadarPath.Text);
}

问题是在GetImagesFiles方法中,在其名称GetImagesFiles上有一条绿色线警告:
严重性代码说明项目文件行禁止显示状态警告CS1998此异步方法缺少“await”运算符,将同步运行。请考虑使用“await”运算符等待非阻止API调用,或使用“await Task.Run(...)”在后台线程上执行占用CPU的工作。Weather D:\Csharp Projects\Weather\Form1.cs 415 Active
我想在继续执行其余代码之前等待获取文件。一旦radarImages数组不为空且其长度大于0,则继续执行其余代码。

wbgh16ku

wbgh16ku1#

GetImagesFiles中没有异步,所以你可以从它里面删除async Task。这与Stephen Cleary在Task.Run Etiquette Examples: Don't Use Task.Run in the Implementation中的建议一致。我也会将setter从GetImagesFiles中删除,得到的代码看起来像这样:

private string[] GetImagesFiles(string radarImagesFolder)
{
    DirectoryInfo lastRadarWrittenFolder = null;

    var tt = new DirectoryInfo(textBoxRadarPath.Text).GetDirectories();
    if (tt.Length > 0)
    {
        lastRadarWrittenFolder = new DirectoryInfo(textBoxRadarPath.Text).GetDirectories()
            .OrderBy(d => d.CreationTimeUtc).First();
    }

    if (Directory.Exists(radarImagesFolder) && tt.Length > 0)
    {
         return Directory.GetFiles(lastRadarWrittenFolder.FullName, "*.png");
    }

    return null;
}

和调用:

private async void Completed(object sender, AsyncCompletedEventArgs e, Stopwatch sw, string urlAddress)
{
    var result = await Task.Run(GetImagesFiles(textBoxRadarPath.Text));
    if(result != null)
    {
        radarImages = result;
    }
}

附言
虽然返回null作为标记可能会有代码味道,但是为了简洁,并且由于缺乏关于您正在使用的语言版本的知识,我使用了这种方法。

相关问题