我想使用.NET-FTP Libary(http://netftp.codeplex.com)。該庫提供BeginOpenRead(string,AsyncCallback,object)以使用異步編程模型下載內容。我的回調實現基本相同的例子:AsyncCallback到BackgroundWorker
static void BeginOpenReadCallback(IAsyncResult ar) {
FtpClient conn = ar.AsyncState as FtpClient;
try {
if (conn == null)
throw new InvalidOperationException("The FtpControlConnection object is null!");
using (Stream istream = conn.EndOpenRead(ar)) {
byte[] buf = new byte[8192];
try {
DateTime start = DateTime.Now;
while (istream.Read(buf, 0, buf.Length) > 0) {
double perc = 0;
if (istream.Length > 0)
perc = (double)istream.Position/(double)istream.Length;
Console.Write("\rTransferring: {0}/{1} {2}/s {3:p} ",
istream.Position.FormatBytes(),
istream.Length.FormatBytes(),
(istream.Position/DateTime.Now.Subtract(start).TotalSeconds).FormatBytes(),
perc);
}
}
finally {
Console.WriteLine();
istream.Close();
}
}
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
finally {
m_reset.Set();
}
}
異步方法的工作完成後,這將是巨大的,如果已完成的事件被觸發(通過在啓動異步方法的線程爲了沒有問題與用戶界面)將結果傳遞給主線程。就像BackgroundWorker一樣(使用RunWorkerCompleted)。
我該如何認識到這一點?
您使用的是什麼版本的.NET?您的選項在版本3.5,4和4.5之間有所不同。 –
您需要知道要調用哪個線程,現在您不知道,並且在發佈的代碼中沒有可以找到的地方。 BackgroundWorker通過在其RunWorkerAsync()方法中複製SynchronizationContext.Current來完成該操作,之後使用其Post()方法調用回來。你必須在這個庫中找到一個類似的地方,你可以製作副本。或者只是留給用戶界面來調用,它永遠不會有猜測如何正確執行的問題。 –
我使用.NET v4.0 – 0xDEADBEEF