exception: 작업을 완료한 후 작업을 최종 상태로 전환합니다.

3316 단어 c#
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; 
            } 
        } 
 

좋은 웹페이지 즐겨찾기