异步回调到BackgroundWorker

2024-05-27

我想使用 .NET-FTP 库(http://netftp.codeplex.com 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 出现问题)将结果传递给主线程,那就太好了。就像BackgroundWorker 所做的那样(使用RunWorkerCompleted)。

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


尝试转换APM http://msdn.microsoft.com/en-us/library/ms228963%28v=vs.110%29.aspx模式进入TAP http://msdn.microsoft.com/en-us/library/hh873175%28v=vs.110%29.aspx图案 (更多信息 http://blogs.msdn.com/b/pfxteam/archive/2011/06/27/using-tasks-to-implement-the-apm-pattern.aspx):

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 http://msdn.microsoft.com/en-us/library/hh137813%28v=vs.110%29.aspx:

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

BackgroundWorker被基于任务的 API 取代,因此这可能是一个双赢的局面(更多信息:Task.Run 与 BackgroundWorker http://blog.stephencleary.com/search/label/Task.Run%20vs%20BackgroundWorker and here https://stackoverflow.com/a/21327014/1768303).

[UPDATE]如果您在 VS2012+ 中工作,则可以使用 .NET 4.0 为目标微软Bcl.Async http://www.nuget.org/packages/microsoft.bcl.async并且仍然使用现代语言和 TPL 功能,例如async/await。我已经经历过这一点,并且我强烈推荐它,因为它使将来移植到 .NET 4.5 变得轻而易举。

否则,您可以使用Task.ContinueWith(callback, TaskScheduler.FromCurrentSynchronizationContext())继续 UI 线程。这是一个相关例子 https://stackoverflow.com/a/21346870/1768303.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步回调到BackgroundWorker 的相关文章

  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • .NET 中是否有内置函数可以对密码进行哈希处理?

    我看到这个问题加密 散列数据库中的纯文本密码 https stackoverflow com questions 287517 encrypting hashing plain text passwords in database 我知道我
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 通过 Active Directory 搜索进行有效分页

    在 NET 中使用 Active Directory 搜索进行分页的有效方法是什么 在 AD 中进行搜索的方法有很多 但到目前为止我找不到如何有效地进行搜索 我希望能够表明Skip and Take参数并能够检索结果中与我的搜索条件匹配的记
  • 数组中 1 到 100 个奇数

    Ruby 中有什么很酷的方法可以创建一个 1 到 100 且只有奇数条目 1 3 等 的数组 我现在有一个循环 但这显然不是一个很酷的方法 有什么建议么 我当前的代码 def create 1 to 100 odd array array
  • java模拟自定义对象

    public class MainClass public void makeCall CustomObject obj new CustomObject obj testMethod 我想进行单元测试makeCall 所以我必须嘲笑Cus
  • 按行重塑矩阵

    我有一个大小为 18000 x 54 的矩阵 我想将其重塑为大小为 54000 x 18 的矩阵 其中初始矩阵的每一行都变成一个有 3 行的矩阵 让我们举个例子 我有一个矩阵如下 a matrix 1 18 nrow 2 ncol 9 by
  • 底页横向问题

    在横向模式下显示底部工作表对话框时 我遇到了错误的行为 该问题出现在24 版本的设计库中 根据下图 底页仅在横向模式下无法正确显示 我正在使用 BottomSheetDialog 类 并且正在遵循本教程 http www skholingu
  • 以编程方式移动 UWP ListView 中的项目而不刷新

    下面的问题让我忙了好一阵子 看起来很基础 但就是不行 归结起来是这样的 将 ListView 绑定到代码隐藏中的某个合适的集合 ObservableCollection ReactiveList 等 我每 x 秒一次移动一个物品 每次移动时
  • IntelliJ Idea,如何从控制台删除java文件目录?

    当您运行文件时 它会打开控制台窗口 并且一直在顶部显示该文件所在的目录 这非常令人恼火 因为现在 为了将其他行与目录混合分开 我必须在启动任何 System out println 命令之前使用 n C Program FILEs 我想摆脱
  • MongoDB:更新数组中的文档

    我有一个包含此架构文档的集合 id something recipients id 1 name Andrey isread false id 2 name John isread false 现在 我想使用以下命令更新 John id 2
  • 带有 @Scheduled Spring 注释的方法的切入点

    我想要一个带有注释的方法的 AspectJ 切入点 Scheduled 尝试了不同的方法但没有任何效果 1 Pointcut execution org springframework scheduling annotation Sched
  • jQuery 改变 colorbox 的内容

    我已经尝试过类似标题的问题 但它们不起作用 例如 如何将 AJAX 内容加载到当前 Colorbox 窗口中 https stackoverflow com questions 5273311 how to load ajax conten
  • 没有这样的属性:类的variantConfiguration:

    升级 gradle 4 0 0 应用程序构建失败后 出现错误消息 没有这样的属性 类的variantConfiguration com android build gradle internal variant ApplicationVar
  • 将数据从 javascript 发送到 mysql 数据库

    我有这个小点击计数器 我想将每次点击都包含在 mysql 表中 有人可以帮忙吗 var count1 0 function countClicks1 count1 count1 1 document getElementById p1 in
  • 使用自定义 gem 在 Dreamhost/Passenger 上部署 Sinatra 应用程序

    我有一个 Sinatra 应用程序 正在尝试在 Dreamhost 上运行 该应用程序利用 pony 发送电子邮件 为了让应用程序从一开始就启动并运行 在添加小马之前 我必须gem unpack rack and gem unpack si
  • R strsplit 问题(容易解决吗?)

    这应该是一件很容易做到的事情 我在这里读到的类似示例有点复杂 而且这些技术对我来说并不真正有效 我有一个名为 id string 的变量 gt typeof id string 1 character and gt id string 1
  • jquery菜单栏浮动顶部

    我试图使菜单栏不断浮动在浏览器的顶部 因此当他们向下滚动页面时 菜单栏仍位于顶部 我该怎么做呢 Regards CSS 标签position fixed 即使滚动 也会使其保持在屏幕上的同一位置 使用它 然后将其定位为top right b
  • .NET 4.0 构建服务器引用程序集警告 MSB3644 [重复]

    这个问题在这里已经有答案了 我的构建服务器上出现了一堆错误 C WINDOWS Microsoft NET Framework v4 0 30319 Microsoft Common targets 847 9 警告MSB3644 找不到框
  • Pandas read_sql 读取时更改大量 ID

    我将 Oracle 数据库转移到 SQL Server 一切似乎都很顺利 各种 ID 列都是很大的数字 因此我不得不使用 Decimal 因为它们对于 BigInt 来说太大了 我现在尝试使用 pandas read sql 使用 pyod
  • Jquery toggle() 函数无法与hoverwords() 滑动字母扩展一起使用

    我有 2 个 div 每 3 秒切换一次 现在 对于 div 中的文本 我使用一个名为 滑动字母 的扩展 正如您在此处提供的演示中看到的那样 http tympanus net Development SlidingLetters http
  • Excel动态数组运行重复项计数

    我一直在重新设计一些旧的电子表格工具 以便使用 Excel 的较新工具来过滤和格式化动态数据输出动态数组公式 https support microsoft com en us office dynamic array formulas a
  • 异步回调到BackgroundWorker

    我想使用 NET FTP 库 http netftp codeplex com http netftp codeplex com 该库提供 BeginOpenRead string AsyncCallback object 使用异步编程模型