热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

异常处理:在任务完成后尝试将其转换为最终状态的操作分析

本文探讨了在任务完成后将其转换为最终状态时的异常处理机制。通过分析`TaskCompletionSource`的使用场景,详细阐述了其在异步编程中的重要作用,并提供了具体的实现方法和注意事项,帮助开发者更好地理解和应用这一技术。

refs:

https://stackoverflow.com/questions/15316613/when-should-taskcompletionsourcet-be-used

https://technet.microsoft.com/zh-cn/library/dd449174(v=vs.110).aspx

https://code.msdn.microsoft.com/Windows-Phone-8-Networking-835239c1/sourcecode?fileId=70769&pathId=221052408

相关

https://hmemcpy.com/2013/01/turning-old-and-busted-asynchronous-code-into-new-asyncawait-enabled-hotness-with-taskcompletionsourcet/


An attempt was made to transition a task to a final state when it had already completed

TaskCompletionSource is used to create Task objects that don't execute code. 
In Real World Scenarios TaskCompletionSource is ideal for I/O bound operations. 
This way you get all the benefits of tasks (e.g. return values, continuations etc) without blocking a thread for the duration of the operation. 
If your "function" is an IO bound operation it isn't recommended to block a thread using a new Task. 
Instead using TaskCompletionSource you can create a slave task to just indicate when your I/O bound operation finishes or faults.


TaskCompletionSource 对于非task型方法,并且有事务需要处理,可返回task,并带上result或exception
如(only a event based api is available )

 TaskCompletionSource completionSource; 
        public Task SendUsingManagedSocketsAsync(string strServerIP) 
        { 
            // enable asynchronous task completion 
            completiOnSource= new TaskCompletionSource(); 
            // create a new socket  
            var socket = new Socket(AddressFamily.InterNetwork, 
                SocketType.Stream, 
                ProtocolType.Tcp); 
 
            // create endpoint  
            var ipAddress = IPAddress.Parse(strServerIP); 
            var endpoint = new IPEndPoint(ipAddress, PORT); 
 
            // create event args  
            var args = new SocketAsyncEventArgs(); 
            args.RemoteEndPoint = endpoint; 
            args.Completed += SocketConnectCompleted; 
 
            // check if the completed event will be raised. If not, invoke the handler manually.  
            if (!socket.ConnectAsync(args)) 
                SocketConnectCompleted(args.ConnectSocket, args); 
 
            return completionSource.Task; 
        } 
 
        private void SocketConnectCompleted(object sender, SocketAsyncEventArgs e) 
        { 
            // check for errors  
            if (e.SocketError != System.Net.Sockets.SocketError.Success) 
            { 
                completionSource.SetException(new Exception("Failed with " + e.SocketError)); 
 
                // do some resource cleanup  
                CleanUp(e); 
                return; 
            } else 
            { 
                completionSource.SetResult(null); 
            } 
 
            // check what has been executed  
            switch (e.LastOperation) 
            { 
                case SocketAsyncOperation.Connect: 
                    HandleConnect(e); 
                    break; 
                case SocketAsyncOperation.Send: 
                    HandleSend(e); 
                    break; 
            } 
        } 
 



推荐阅读
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 闭包函数,即匿名函数,在PHP中通过Closure类表示。本文将探讨如何访问闭包内的static、this及parameter等关键属性。 ... [详细]
  • 本文介绍了如何在Java中使用org.apache.commons.math3.linear.ArrayRealVector.getEntry()方法,并提供了多个实际应用中的代码示例。 ... [详细]
  • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 开发笔记:由数据库某字段存数组引发的json_encode/serialize思考
    开发笔记:由数据库某字段存数组引发的json_encode/serialize思考 ... [详细]
  • 本文详细介绍了Java库XChart中的XYSeries类下的setLineColor()方法,并提供了多个实际应用场景的代码示例。 ... [详细]
author-avatar
唐旭阳一一一滴泪15
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有