exception:在已经完成 任务后,尝试将任务转换为最终状态。

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<object> completionSource; 
        public Task SendUsingManagedSocketsAsync(string strServerIP) 
        { 
            // enable asynchronous task completion 
            completionSource = new TaskCompletionSource<object>(); 
            // 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; 
            } 
        } 
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值