在 C#(Net4.5、Win10)中,我撰寫了一個電子郵件檢查器插件。它處理 Gmail/POP/IMAP。有用。但是插件經常會長時間凍結應用程式,如果存在連接問題等。在 C# 中,我如何“包裝”(委托給單獨的執行緒?)GetEmails() 函式,以便 1) 它不會被察覺“凍結”應用程式的其余部分,2) 如果它不能在大約 5 秒內完成它的作業,它會超時嗎?
private static void GetEmails(int i) {
// if Gmail
cred = new NetworkCredential(user,password);
request = (HttpWebRequest)WebRequest.Create(atomURL);
try {
response = (HttpWebResponse)request.GetResponse();
...
// if POP
try {
pop.Connect();
...
// if IMAP
try {
imap.Connect();
...
}
uj5u.com熱心網友回復:
您的應用程式凍結,因為所有操作都發生在主執行緒上,包括 UI。當長時間操作正在進行時,主執行緒忙于做事,因此 UI 變得無回應。
對于這個多執行緒/并行編程是為了將長操作委托給不同的執行緒。
有多種方法可以進行多執行緒編程,其中一些是:
Task Parallel Library(TPL) (推薦)或 Background Worker
任務并行庫(TPL) 訪問鏈接
后臺作業人員訪問鏈接
uj5u.com熱心網友回復:
如果有人有同樣的問題。大多數“異步”檔案都承諾很簡單,然后膨脹到膨脹。此外,在現有專案中,“async/await”邏輯可能會變得復雜,需要級聯更改,并且您可能會卡在沒有 GetAwaiter() 的函式上(例如 GetResponse())。這是我為現有函式制作的一個簡單的任務包裝器(帶超時)。
C-Sharp 中的異步編程
var cts = new CancellationTokenSource();
var token = cts.Token;
cts.CancelAfter(5000);
Task task = Task.Run(() => { GetEmails(i, cts); }, token);
private static void GetEmails(int i, CancellationToken token) {
try {
...
token.ThrowIfCancellationRequested();
} catch (Exception ex) {
//will be thrown if cts.IsCancellationRequested
return;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399903.html
