有兩種方法,一種方法依賴于另一種方法。我需要將幾個檔案并行發送到服務器,首先來自服務器的答案,然后將其發送到DownloadFileAsync方法,并對其余檔案執行相同操作(無需一次等待所有答案,發送它們(來自服務器的答案)方法DownloadFileAsync(),因為它們被接收)。
public async Task CompressAllFilesAsync(List<UserFile> files, string outputpath)
{
await UploadAllFilesAsync(files);
await DownloadAllFilesAsync(files, outputpath);
}
public async Task UploadAllFilesAsync(List<UserFile> files)
{
IEnumerable<Task> allTasks = files.Select(async (file, i) =>
files[i].FileLink = await UploadFileAsync(files[i])
);
await Task.WhenAll(allTasks);
}
public async Task DownloadAllFilesAsync(List<UserFile> files, string outputpath)
{
IEnumerable<Task> allTasks = files.Select((file, i) =>
DownloadFileAsync(files[i].FileLink,
Path.Combine(outputpath, $"{files[i].FileName}")
));
await Task.WhenAll(allTasks);
}
DownloadAllFilesAsync()現在程式在運行該方法之前等待來自服務器的所有答案(可下載檔案的鏈接) 。

uj5u.com熱心網友回復:
您可以考慮使用新的 (.NET 6) API Parallel.ForEachAsync,UploadFileAsync然后DownloadFileAsync依次執行 each UserFile,但與其他檔案同時執行:
public async Task CompressAllFilesAsync(List<UserFile> files, string outputPath)
{
var options = new ParallelOptions() { MaxDegreeOfParallelism = 10 };
await Parallel.ForEachAsync(files, options, async (file, ct) =>
{
await UploadFileAsync(file);
await DownloadFileAsync(file.FileLink,
Path.Combine(outputPath, $"{file.FileName}"));
});
}
UploadFileAsync和將在執行緒DownloadFileAsync上呼叫。ThreadPool這應該不是問題,除非這些方法與執行緒仿射組件(如 UI 控制元件)互動。
uj5u.com熱心網友回復:
如果需要限制同時上傳的檔案數量,使用 SemaphoreSlim:
- 如何使用 SemaphoreSlim
- 為什么必須在方法外宣告 SemaphoreSlim
public async Task CompressAllFilesAsync(List<UserFile> files, string outputpath)
{
IEnumerable<Task> allTasks = files.Select(async (file, i) => {
files[i].FileLink = await UploadFileAsync(files[i]);
await DownloadFileAsync(files[i].FileLink,
Path.Combine(outputpath, $"{files[i].FileName}"));
});
await Task.WhenAll(allTasks);
}
uj5u.com熱心網友回復:
for (int i = 0; i < fileToSend; i )
{
Task task = new Task(() =>
{
SendFile(file[i]);
});
task.Start();
}
這樣,您將創建一個后臺任務,該任務將并行發送您的檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426412.html
