gpt4 book ai didi

c# - AsyncCallback 到 BackgroundWorker

转载 作者:行者123 更新时间:2023-11-30 22:09:36 24 4
gpt4 key购买 nike

我想使用 .NET-FTP 库 ( http://netftp.codeplex.com )。该库提供 BeginOpenRead(string,AsyncCallback,object) 以使用异步编程模型下载内容。我对回调的实现与示例基本相同:

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();
}
}

异步方法的工作完成后,如果触发 Completed 事件(由启动异步方法的线程,以便 UI 没有问题)将结果传递给 Main-,那就太好了线。就像 BackgroundWorker 所做的那样(使用 RunWorkerCompleted)。

我怎样才能意识到这一点?

最佳答案

尝试转换 APM图案进入 TAP模式(more info):

static public Task<Stream> OpenReadAsync(FtpClient ftpClient, string url)
{
return Task.Factory.FromAsync(
(asyncCallback, state) =>
ftpClient.BeginOpenRead(url, asyncCallback, state),
(asyncResult) =>
ftpClient.EndOpenRead((asyncResult));
}

然后你可以使用async/await 并且不必担心同步上下文:

Stream istream = await OpenReadAsync(ftpClient, url); 

此外,您可以使用 Stream.ReadAsync :

while (await istream.ReadAsync(buf, 0, buf.Length) > 0) 
{
// ...
}

BackgroundWorker 被基于任务的 API 取代,因此它可能是双赢的局面(更多信息:Task.Run vs BackgroundWorkerhere)。

[更新] 如果您使用 VS2012+,您可以使用 Microsoft.Bcl.Async 定位 .NET 4.0并且仍然使用现代语言和 TPL 功能,如 async/await。我经历过这些,我强烈推荐它,因为它使将来移植到 .NET 4.5 变得轻而易举。

否则,您可以使用 Task.ContinueWith(callback, TaskScheduler.FromCurrentSynchronizationContext()) 继续 UI 线程。这是一个 related example .

关于c# - AsyncCallback 到 BackgroundWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21442523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com