Jim*_*nes -1 .net c# task async-await blazor-server-side
我在使用异步方法时遇到一些问题。我对它有点陌生,但我正在编写一些 Blazor 代码并使用 Blob 存储,并且一些调用需要异步。这是我的代码和问题。此代码需要异步,因为它从 Azure 获取 Blob 数据。(FileUpload 是我的自定义对象):
public async Task<List<FileUpload>> GetAllFilesAsync()
{
// TODO: GENERATE fileupload objects here and return
await foreach (var blobItem in _container.GetBlobsAsync())
{
var name = blobItem.Name;
BlobClient blobClient = _container.GetBlobClient(name);
FileUpload fileUploadViewModel = new FileUpload()
{
FileName = blobItem.Name,
FileStorageUrl = blobClient.Uri.ToString(),
ContentType = blobItem.Properties.ContentType,
};
_allFiles.Add(fileUploadViewModel);
}
return _allFiles;
}
Run Code Online (Sandbox Code Playgroud)
在我的 Blazor 代码(服务器)中,我有以下代码在初始化时调用服务:
private List<FileUpload> fileUploadViewModels = new();
protected override async Task OnInitializedAsync()
{
GetAllBlobsAsync();
}
private void GetAllBlobsAsync()
{
var allFiles = blobStorageService.GetAllFilesAsync();
fileUploadViewModels = allFiles; // This is where the error is thrown
}
Run Code Online (Sandbox Code Playgroud)
错误:无法将类型“System.Threading.Tasks.Task<System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”
我一直在这里和网络上搜索,但还没有找到答案。我尝试了 Task.FromResult() 和其他方法,但没有成功。正如我所说,我对异步和等待有点陌生,所以我希望我只是错过了一些小东西。你能澄清一下我做错了什么吗?
制定GetAllBlobsAsync方法async:
private async Task GetAllBlobsAsync()
Run Code Online (Sandbox Code Playgroud)
所以它内部可以进行这样await的操作:
var allFiles = await blobStorageService.GetAllFilesAsync();
Run Code Online (Sandbox Code Playgroud)
然后await调用方法本身时:
await GetAllBlobsAsync();
Run Code Online (Sandbox Code Playgroud)
基本上,您错过了“一路异步”哲学中的一步,并试图在堆栈中间创建一个同步方法。如果在堆栈底部有一个async正在等待的方法,则堆栈上的所有内容也应该是async。
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |