C#實現(xiàn)FTP文件下載及超時控制詳解
前言
如果你的函數(shù)不是async,你仍然可以實現(xiàn)相同的超時功能,但你將不得不依賴更多的同步代碼或使用.Result或.GetAwaiter().GetResult()來阻塞等待任務(wù)完成,這可能導致死鎖的風險,特別是在UI線程或ASP.NET上下文中。不過,在一些簡單的后臺任務(wù)或控制臺應用程序中,這種方法可能是可行的。
以下是如何在非異步函數(shù)中實現(xiàn)FTP請求與超時控制的示例:
using System;
using System.Net;
using System.Threading.Tasks;
public bool DownloadFileWithTimeoutSync(string uri, string localPath)
{
var ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
// 設(shè)置FtpWebRequest其他屬性,如Credentials等
Task<bool> ftpTask = Task.Run(() =>
{
try
{
using (var response = (FtpWebResponse)ftpRequest.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var fileStream = System.IO.File.Create(localPath))
{
responseStream.CopyTo(fileStream);
}
return true; // 或者根據(jù)響應狀態(tài)返回成功/失敗
}
catch
{
return false;
}
});
// 創(chuàng)建一個延遲10秒的超時任務(wù)
Task delayTask = Task.Delay(TimeSpan.FromSeconds(10));
// 等待FTP任務(wù)完成或超時
var completedTask = Task.WhenAny(ftpTask, delayTask).GetAwaiter().GetResult();
if (completedTask == ftpTask)
{
// FTP任務(wù)完成,檢查結(jié)果
return ftpTask.GetAwaiter().GetResult();
}
else
{
// 超時發(fā)生
// 這里可以根據(jù)需要取消FTP請求
return false;
}
}
請注意,使用.Result或.GetAwaiter().GetResult()會導致當前線程阻塞,直到任務(wù)完成。這在后臺線程或控制臺應用程序中可能是可以接受的,但在UI線程中使用時可能會導致應用程序無響應。如果可能,最佳實踐是使用async和await,因為它們提供了更加清晰和安全的方式來處理異步操作和并發(fā)。
此外,當你調(diào)用.GetAwaiter().GetResult()或.Result時,如果任務(wù)中拋出了異常,這些異常會被封裝在AggregateException中。如果你需要處理特定的異常類型,可能需要檢查AggregateException的InnerExceptions屬性。
場景描述
在進行FTP文件下載時,我們可能會遇到網(wǎng)絡(luò)延遲或服務(wù)不穩(wěn)定的情況,這時候為下載任務(wù)設(shè)置一個超時限制就顯得非常必要。如果超出了預定的時間限制,程序應該能夠自動放棄下載任務(wù),以避免無限期地等待,影響用戶體驗。
實現(xiàn)步驟
我們的目標是創(chuàng)建一個同步方法DownloadFileWithTimeoutSync,這個方法封裝了異步操作,用于從FTP服務(wù)器下載文件,并且如果操作超過了指定的時間(比如10秒),則自動取消。
1. 創(chuàng)建FTP請求
首先,我們需要創(chuàng)建一個FtpWebRequest對象,并設(shè)置必要的屬性,如請求方法、憑證等。
var ftpRequest = (FtpWebRequest)WebRequest.Create(uri); ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
2. 開啟異步下載任務(wù)
我們通過Task.Run啟動一個異步任務(wù)來執(zhí)行下載操作。這樣可以保持UI的響應性,或者避免阻塞主線程。
Task<bool> ftpTask = Task.Run(() => {
// 這里包含下載文件的邏輯
});
3. 實現(xiàn)超時控制
為了實現(xiàn)超時控制,我們使用Task.Delay創(chuàng)建一個延遲任務(wù),作為超時的計時器。然后,我們使用Task.WhenAny等待下載任務(wù)和超時任務(wù)中的任何一個首先完成。
Task delayTask = Task.Delay(TimeSpan.FromSeconds(10)); var completedTask = Task.WhenAny(ftpTask, delayTask).GetAwaiter().GetResult();
4. 處理下載結(jié)果和超時
最后,我們檢查是下載任務(wù)先完成還是超時任務(wù)。如果是下載任務(wù)完成,我們檢查下載是否成功;如果是超時任務(wù)先完成,則認為下載操作超時,返回失敗。
if (completedTask == ftpTask)
{
// 檢查下載結(jié)果
return ftpTask.GetAwaiter().GetResult();
}
else
{
// 處理超時
return false;
}
總結(jié)
通過上述步驟,我們實現(xiàn)了一個具有超時控制的FTP文件下載方法。這個方法既利用了異步編程的優(yōu)勢來提高應用的性能和響應性,又通過超時機制避免了因網(wǎng)絡(luò)問題導致的長時間等待。
異步編程在處理I/O密集型任務(wù)時尤為重要,它能夠有效地提升應用程序的并發(fā)能力和用戶體驗。希望本文的內(nèi)容能幫助你在實際開發(fā)中更好地運用異步編程技術(shù)。
到此這篇關(guān)于C#實現(xiàn)FTP文件下載及超時控制詳解的文章就介紹到這了,更多相關(guān)C# FTP文件下載與超時控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DevExpress實現(xiàn)GridControl顯示Gif動畫的方法
這篇文章主要介紹了DevExpress實現(xiàn)GridControl顯示Gif動畫的方法,這是比較實用的方法,需要的朋友可以參考下2014-08-08
C#如何安全、高效地玩轉(zhuǎn)任何種類的內(nèi)存之Span的本質(zhì)
為什么要使用指針,什么時候需要使用它,以及如何安全、高效地使用它?本文將講清楚 What、How 和 Why ,讓你知其然,更知其所以然2021-08-08
C# 實現(xiàn)PPT 每一頁轉(zhuǎn)成圖片過程解析
這篇文章主要介紹了C# 實現(xiàn)PPT 每一頁轉(zhuǎn)成圖片過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09
C#將PDF文檔轉(zhuǎn)換為Markdown文檔的代碼實現(xiàn)
將PDF文件轉(zhuǎn)換為Markdown格式是一個非常實用的需求,尤其是在需要將內(nèi)容從固定布局的PDF文件中提取出來,并轉(zhuǎn)換為更易于編輯和處理的文本格式時,本文將介紹如何通過C#代碼將PDF文檔轉(zhuǎn)換Markdown(MD)文檔,需要的朋友可以參考下2024-10-10
使用C#輕松實現(xiàn)將Markdown轉(zhuǎn)換為PDF文檔
在日常開發(fā)中,我們經(jīng)常需要將輕量級的 Markdown 文檔轉(zhuǎn)換為格式固定、便于分享的 PDF 文件,下面小編就和大家詳細介紹一下具體實現(xiàn)方法吧2025-12-12
C# PaddleDetection yolo實現(xiàn)印章檢測
這篇文章主要為大家詳細介紹了C#如何結(jié)合PaddleDetection yolo實現(xiàn)印章檢測,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-11-11

