I'm working on a Blazor project.
I try to make a asynchronous function to get ".avi" and ".mkv" files from directory. But When I try to access the page instead of having my "Loading..." message, it takes times until I got all the result in one time.
以下是我的服务代码:
namespace FilesScanner
{
public class FilesScannerService
{
public async Task<IEnumerable<FileInfo>> GetFilesAsync(string path,
EnumerationOptions options, string[] extensions)
{
DirectoryInfo dir = new(path);
return await Task.Run(() => extensions.SelectMany(x => dir.EnumerateFiles(x, options)
.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden))));
}
}
}
下面是Blazor页面的代码,我在其中调用了上面的函数:
using FilesScanner;
using Microsoft.AspNetCore.Components;
namespace MovieLibrary.Pages
{
public partial class Files
{
[Inject] private FilesScannerService _scannerService { get; set; }
public IEnumerable<FileInfo> FilesInfos { get; set; }
protected override async Task OnInitializedAsync()
{
string path = @"C:\Users\username\Videos";
string[] extensions =
{
"*.avi",
"*.mkv"
};
EnumerationOptions opts = new()
{
IgnoreInaccessible = true,
RecurseSubdirectories = true
};
FilesInfos = await _scannerService.GetFilesAsync(path, opts ,extensions);
}
}
}
最后是显示结果的代码:
@page "/files"
@using System.IO;
<h3>Movies</h3>
@if (FilesInfos is not null)
{
try
{
int i = 1;
foreach (FileInfo file in FilesInfos)
{
<p><span style="font-weight:700">@i :</span> @Path.GetFileNameWithoutExtension(@file.Name)</p>
i++;
}
}
catch (UnauthorizedAccessException ex)
{
<p>@ex.Message</p>
}
}
else
{
<h2>LOADING...</h2>
}
我是不是误解了异步函数的某些方面?