Пример #1
1
		private static IEnumerator<Int32> PipeServerAsyncEnumerator(AsyncEnumerator ae) {
			// Each server object performs asynchronous operation on this pipe
			using (var pipe = new NamedPipeServerStream(
				"Echo", PipeDirection.InOut, -1, PipeTransmissionMode.Message,
				PipeOptions.Asynchronous | PipeOptions.WriteThrough)) {
				// Asynchronously accept a client connection
				pipe.BeginWaitForConnection(ae.End(), null);
				yield return 1;

				// A client connected, let's accept another client
				var aeNewClient = new AsyncEnumerator();
				aeNewClient.BeginExecute(PipeServerAsyncEnumerator(aeNewClient),
					aeNewClient.EndExecute);

				// Accept the client connection
				pipe.EndWaitForConnection(ae.DequeueAsyncResult());

				// Asynchronously read a request from the client
				Byte[] data = new Byte[1000];
				pipe.BeginRead(data, 0, data.Length, ae.End(), null);
				yield return 1;

				// The client sent us a request, process it
				Int32 bytesRead = pipe.EndRead(ae.DequeueAsyncResult());

				// Just change to upper case
				data = Encoding.UTF8.GetBytes(
					Encoding.UTF8.GetString(data, 0, bytesRead).ToUpper().ToCharArray());

				// Asynchronously send the response back to the client
				pipe.BeginWrite(data, 0, data.Length, ae.End(), null);
				yield return 1;

				// The response was sent to the client, close our side of the connection
				pipe.EndWrite(ae.DequeueAsyncResult());
			} // Close happens in a finally block now!
		}
Пример #2
0
    private static IEnumerator<Int32> ProcessAllAndEachOps(AsyncEnumerator ae, String[] urls)
    {
        Int32 numOps = urls.Length;

          // Issue all the asynchronous operation(s) so they run concurrently
          for (Int32 n = 0; n < numOps; n++) {
         WebRequest wr = WebRequest.Create(urls[n]);
         wr.BeginGetResponse(ae.End(), wr);
          }

          // Have AsyncEnumerator wait until ALL operations complete
          yield return numOps;

          Console.WriteLine("All the operations completed:");
          for (Int32 n = 0; n < numOps; n++) {
         ProcessCompletedWebRequest(ae.DequeueAsyncResult());
          }

          Console.WriteLine(); // *** Blank line between demos ***
          System.Diagnostics.Debugger.Break();

          // Issue all the asynchronous operation(s) so they run concurrently
          for (Int32 n = 0; n < numOps; n++) {
         WebRequest wr = WebRequest.Create(urls[n]);
         wr.BeginGetResponse(ae.End(), wr);
          }

          for (Int32 n = 0; n < numOps; n++) {
         // Have AsyncEnumerator wait until EACH operation completes
         yield return 1;

         Console.WriteLine("An operation completed:");
         ProcessCompletedWebRequest(ae.DequeueAsyncResult());
          }
    }
        private IEnumerator <Int32> GetImagesFromGoogle(AsyncEnumerator ae, string searchUrl, Int32 imageNumber)
        {
            InitiateWebRequest(ae, searchUrl);
            yield return(1);

            String resultPage;

            using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
            {
                resultPage = GetSearchResutlPage(response);
            }
            IEnumerable <String> imageURIs = GetImageURIFromResultPage(resultPage);
            int currentURI = 0;

            Int32 _downloaded = 0;

            while (_downloaded < imageNumber && currentURI < imageURIs.Count())
            {
                InitiateWebRequest(ae, imageURIs.ElementAt(currentURI++));
                yield return(1);

                try
                {
                    using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
                    {
                        _GoogledImages.Add(GetImageFromResponse(response));
                        _downloaded++;
                    }
                }
                catch (Exception e)
                {
                }
            }
            yield  break;
        }
Пример #4
0
    private static IEnumerator <Int32> PipeClientAsyncEnumerator(AsyncEnumerator ae, String serverName, String message)
    {
        // Each client object performs asynchronous operations on this pipe
        using (var pipe = new NamedPipeClientStream(serverName, "Echo",
                                                    PipeDirection.InOut, PipeOptions.Asynchronous | PipeOptions.WriteThrough)) {
            pipe.Connect(); // Must Connect before setting ReadMode
            pipe.ReadMode = PipeTransmissionMode.Message;

            // Asynchronously send data to the server
            Byte[] output = Encoding.UTF8.GetBytes(message);
            pipe.BeginWrite(output, 0, output.Length, ae.End(), null);
            yield return(1);

            // The data was sent to the server
            pipe.EndWrite(ae.DequeueAsyncResult());

            // Asynchronously read the server's response
            Byte[] data = new Byte[1000];
            pipe.BeginRead(data, 0, data.Length, ae.End(), data);
            yield return(1);

            // The server responded, display the response and close out connection
            Int32 bytesRead = pipe.EndRead(ae.DequeueAsyncResult());

            Console.WriteLine("Server response: " + Encoding.UTF8.GetString(data, 0, bytesRead));
        } // Close();
    }
Пример #5
0
        private static IEnumerator <Int32> CopyStream(AsyncEnumerator <Int64> ae, Stream source, Stream destination, Int32 bufferSize, Action <Int64> reportProgress)
        {
            Byte[] buffer         = new Byte[bufferSize];
            Int64  totalBytesRead = 0;

            while (true)
            {
                ae.SetOperationTag("Reading from source stream");
                // Read whichever is smaller (number of bytes left to read OR the buffer size)
                source.BeginRead(buffer, 0, buffer.Length, ae.End(), null);
                yield return(1);

                Int32 bytesReadThisTime = source.EndRead(ae.DequeueAsyncResult());
                totalBytesRead += bytesReadThisTime;

                ae.SetOperationTag("Writing to destination stream");
                destination.BeginWrite(buffer, 0, bytesReadThisTime, ae.End(), null);
                yield return(1);

                destination.EndWrite(ae.DequeueAsyncResult());

                if (reportProgress != null)
                {
                    reportProgress(totalBytesRead);
                }
                if (bytesReadThisTime < buffer.Length)
                {
                    break;
                }
            }
            ae.Result = totalBytesRead;
        }
Пример #6
0
        private static IEnumerator <int> GenerateTransferTask(
            AsyncEnumerator ae, HttpContext context, string url)
        {
            WebRequest request = WebRequest.Create(url);

            request.BeginGetResponse(ae.End(), null);
            yield return(1);

            using (WebResponse response = request.EndGetResponse(ae.DequeueAsyncResult()))
            {
                Stream streamIn  = response.GetResponseStream();
                Stream streamOut = context.Response.OutputStream;
                byte[] buffer    = new byte[1024];

                while (true)
                {
                    streamIn.BeginRead(buffer, 0, buffer.Length, ae.End(), null);
                    yield return(1);

                    int lengthRead = streamIn.EndRead(ae.DequeueAsyncResult());

                    if (lengthRead <= 0)
                    {
                        break;
                    }

                    streamOut.BeginWrite(buffer, 0, lengthRead, ae.End(), null);
                    yield return(1);

                    streamOut.EndWrite(ae.DequeueAsyncResult());
                }
            }
        }
Пример #7
0
 public IEnumerator<int> Login(SerializedObject request, string loginID, string password, string version, int appType, AsyncEnumerator ae)
 {
     long session = request.Session;
     string connectionString = SettingManager.Default.ConnectionString;
     IsFailedCountExceed(loginID, password, connectionString);
     LoginParameter loginParameter = new LoginParameter();
     loginParameter.CompanyName = string.Empty;
     if (loginID == String.Empty)
     {
         AuditHelper.AddIllegalLogin(AppType.TradingConsole, loginID, password, this.GetLocalIP());
         Application.Default.TradingConsoleServer.SaveLoginFail(loginID, password, GetLocalIP());
         SendErrorResult(request);
         yield break;
     }
     string message = string.Empty;
     Application.Default.ParticipantService.BeginLogin(loginID, password, ae.End(), null);
     yield return 1;
     loginParameter.UserID = Application.Default.ParticipantService.EndLogin(ae.DequeueAsyncResult());
     if (loginParameter.UserID == Guid.Empty)
     {
         _Logger.ErrorFormat("{0} is not a valid user", loginID);
     }
     else
     {
         Guid programID = new Guid(SettingManager.Default.GetLoginSetting("TradingConsole"));
         Guid permissionID = new Guid(SettingManager.Default.GetLoginSetting("Run"));
         Application.Default.SecurityService.BeginCheckPermission(loginParameter.UserID, programID, permissionID, "", "", loginParameter.UserID, ae.End(), null);
         yield return 1;
         bool isAuthrized = Application.Default.SecurityService.EndCheckPermission(ae.DequeueAsyncResult(), out message);
         if (!isAuthrized)
         {
             _Logger.ErrorFormat("{0} doesn't have the right to login trader", loginID);
             loginParameter.UserID = Guid.Empty;
         }
         else
         {
             Token token = new Token(Guid.Empty, UserType.Customer, (AppType)appType);
             token.UserID = loginParameter.UserID;
             token.SessionID = session.ToString();
             SessionManager.Default.AddToken(session, token);
             Application.Default.StateServer.BeginLogin(token, ae.End(), null);
             yield return 1;
             bool isStateServerLogined = Application.Default.StateServer.EndLogin(ae.DequeueAsyncResult());
             SetLoginParameter(loginParameter, session, password, version, appType, isStateServerLogined, token);
         }
     }
     if (loginParameter.UserID == Guid.Empty)
     {
         AuditHelper.AddIllegalLogin(AppType.TradingConsole, loginID, password, this.GetLocalIP());
         Application.Default.TradingConsoleServer.SaveLoginFail(loginID, password, GetLocalIP());
         SendErrorResult(request);
     }
     else
     {
         SetResult(request, loginParameter, session, loginID, password, version, appType, connectionString);
     }
 }
Пример #8
0
    private static IEnumerator <Int32> PipeServerAsyncEnumerator(AsyncEnumerator ae)
    {
        // Each server object performs asynchronous operations on this pipe
        using (var pipe = new NamedPipeServerStream(
                   "Echo", PipeDirection.InOut, -1, PipeTransmissionMode.Message,
                   PipeOptions.Asynchronous | PipeOptions.WriteThrough)) {
            // Asynchronously accept a client connection
            pipe.BeginWaitForConnection(ae.End(), null);
            yield return(1);

            // A client connected, let's accept another client
            var aeNewClient = new AsyncEnumerator();
            aeNewClient.BeginExecute(PipeServerAsyncEnumerator(aeNewClient), aeNewClient.EndExecute);

            // Accept the client connection
            pipe.EndWaitForConnection(ae.DequeueAsyncResult());

            // Asynchronously read a request from the client
            Byte[] data = new Byte[1000];
            pipe.BeginRead(data, 0, data.Length, ae.End(), null);
            yield return(1);

            // The client sent us a request, process it.
            Int32 bytesRead = pipe.EndRead(ae.DequeueAsyncResult());

            // Get the timestamp of this client's request
            DateTime now = DateTime.Now;

            // We want to save the timestamp of the most-recent client request. Since multiple
            // clients are running concurrently, this has to be done in a thread-safe way
            s_gate.BeginRegion(SyncGateMode.Exclusive, ae.End()); // Request exclusive access
            yield return(1);                                      // The iterator resumes when exclusive access is granted

            if (s_lastClientRequestTimestamp < now)
            {
                s_lastClientRequestTimestamp = now;
            }

            s_gate.EndRegion(ae.DequeueAsyncResult()); // Relinquish exclusive access

            // My sample server just changes all the characters to uppercase
            // But, you can replace this code with any compute-bound operation
            data = Encoding.UTF8.GetBytes(
                Encoding.UTF8.GetString(data, 0, bytesRead).ToUpper().ToCharArray());

            // Asynchronously send the response back to the client
            pipe.BeginWrite(data, 0, data.Length, ae.End(), null);
            yield return(1);

            // The response was sent to the client, close our side of the connection
            pipe.EndWrite(ae.DequeueAsyncResult());
        } // Close the pipe
    }
Пример #9
0
        private static IEnumerator <int> GetAsyncEnumerator(
            AsyncEnumerator ae,
            string urlIn,
            string urlOut,
            Action <double> onProgress,
            Action <int> onComplete)
        {
            onProgress(0);

            var requestIn = WebRequest.Create(urlIn);

            requestIn.BeginGetResponse(ae.End(), null);
            yield return(1);

            using (var responseIn = requestIn.EndGetResponse(ae.DequeueAsyncResult()))
            {
                var streamIn = responseIn.GetResponseStream();

                var requestOut = WebRequest.Create(urlOut);
                requestOut.Method = "POST";

                var totalLength = (int)responseIn.ContentLength;

                requestOut.BeginGetRequestStream(ae.End(), null);
                yield return(1);

                using (var streamOut = requestOut.EndGetRequestStream(ae.DequeueAsyncResult()))
                {
                    var totalRead = 0;
                    var buffer    = new byte[10240];

                    while (totalRead < totalLength)
                    {
                        streamIn.BeginRead(buffer, 0, buffer.Length, ae.End(), null);
                        yield return(1);

                        var lengthRead = streamIn.EndRead(ae.DequeueAsyncResult());

                        streamOut.BeginWrite(buffer, 0, lengthRead, ae.End(), null);
                        yield return(1);

                        streamOut.EndWrite(ae.DequeueAsyncResult());

                        totalRead += lengthRead;
                        onProgress(100.0 * totalRead / totalLength);
                    }
                }

                onComplete(totalLength);
            }
        }
Пример #10
0
 private IEnumerator<Int32> DownloadString(AsyncEnumerator ae, String uri)
 {
     var request = WebRequest.Create(uri);
      request.BeginGetResponse(ae.End(), null);
      yield return 1;
      var response = (WebResponse) request.EndGetResponse(ae.DequeueAsyncResult());
      Byte[] buffer = new Byte[response.ContentLength];
      using (var stream = response.GetResponseStream()) {
     stream.BeginRead(buffer, 0, buffer.Length, ae.End(), null);
     yield return 1;
     stream.EndRead(ae.DequeueAsyncResult());
      }
      m_textBox.Text = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
 }
Пример #11
0
        private static IEnumerator<int> GetAsyncEnumerator(
            AsyncEnumerator ae,
            string urlIn,
            string urlOut,
            Action<double> onProgress,
            Action<int> onComplete)
        {
            onProgress(0);

            var requestIn = WebRequest.Create(urlIn);
            requestIn.BeginGetResponse(ae.End(), null);
            yield return 1;

            using (var responseIn = requestIn.EndGetResponse(ae.DequeueAsyncResult()))
            {
                var streamIn = responseIn.GetResponseStream();

                var requestOut = WebRequest.Create(urlOut);
                requestOut.Method = "POST";

                var totalLength = (int)responseIn.ContentLength;

                requestOut.BeginGetRequestStream(ae.End(), null);
                yield return 1;

                using (var streamOut = requestOut.EndGetRequestStream(ae.DequeueAsyncResult()))
                {
                    var totalRead = 0;
                    var buffer = new byte[10240];

                    while (totalRead < totalLength)
                    {
                        streamIn.BeginRead(buffer, 0, buffer.Length, ae.End(), null);
                        yield return 1;
                        var lengthRead = streamIn.EndRead(ae.DequeueAsyncResult());

                        streamOut.BeginWrite(buffer, 0, lengthRead, ae.End(), null);
                        yield return 1;
                        streamOut.EndWrite(ae.DequeueAsyncResult());

                        totalRead += lengthRead;
                        onProgress(100.0 * totalRead / totalLength);
                    }
                }

                onComplete(totalLength);
            }
        }
Пример #12
0
        private static IEnumerator <Int32> FetchStockQuotesAsyncEnumerator(AsyncEnumerator ae, WebService svc)
        {
            svc.BeginFetchStockQuotes(ae.End(), null);
            yield return(1);

            IStockQuote qt = svc.EndFetchStockQuotes(ae.DequeueAsyncResult());
        }
Пример #13
0
 public static IEnumerator<int> GetInitData(SerializedObject request, DataSet initData, AsyncEnumerator ae)
 {
     XElement result = null;
     long session = request.Session;
     Token token = SessionManager.Default.GetToken(session);
     if (initData == null)
     {
         Application.Default.StateServer.BeginGetInitData(token, null, ae.End(), null);
         yield return 1;
         int sequence;
         initData = Application.Default.StateServer.EndGetInitData(ae.DequeueAsyncResult(), out sequence);
     }
     try
     {
         var data = Init(session, initData);
         int commandSequence = data.Item2;
         DataSet ds = data.Item1;
         var dict = new Dictionary<string, string>()
         {
             {"commandSequence",commandSequence.ToString()},
             {"data",ds.ToXml()}
         };
         result = XmlResultHelper.NewResult(dict);
         request.Content = result;
         SendCenter.Default.Send(request);
     }
     catch (Exception ex)
     {
         request.Content = XmlResultHelper.NewErrorResult(ex.ToString());
         SendCenter.Default.Send(request);
     }
 }
Пример #14
0
        static IEnumerator <int> ListenerFiber(AsyncEnumerator ae)
        {
            var listeningServer = new TcpListener(IPAddress.Loopback, 9998);

            listeningServer.Start();
            while (!ae.IsCanceled())
            {
                listeningServer.BeginAcceptTcpClient(ae.End(0, listeningServer.EndAcceptTcpClient), null);
                yield return(1);

                if (ae.IsCanceled())
                {
                    yield break;
                }
                var clientSocket = listeningServer.EndAcceptTcpClient(ae.DequeueAsyncResult());
                var clientAe     = new AsyncEnumerator()
                {
                    SyncContext = null
                };
                clientAe.BeginExecute(
                    ClientFiber(clientAe, clientSocket),
                    ar =>
                {
                    try
                    {
                        clientAe.EndExecute(ar);
                    }
                    catch { }
                }, null);
            }
        }
Пример #15
0
        public static IEnumerator <int> ReadBytes(
            byte[] buffer, Stream stream, AsyncEnumerator ae, string type, bool expectedToHaveNoData)
        {
            var totalBytesRead = 0;

            while (totalBytesRead < buffer.Length)
            {
                stream.BeginRead(buffer, totalBytesRead, buffer.Length - totalBytesRead, ae.End(), null);

                yield return(1);

                int bytesRead = stream.EndRead(ae.DequeueAsyncResult());

                if (bytesRead == 0)
                {
                    if (expectedToHaveNoData)
                    {
                        yield break;
                    }

                    throw new InvalidOperationException("Could not read value for " + type);
                }

                totalBytesRead += bytesRead;
            }
        }
 private IEnumerator<Int32> GetImagesFromGoogle(AsyncEnumerator ae,string searchUrl,Int32 imageNumber)
 {
     InitiateWebRequest(ae,searchUrl);
     yield return 1;
     String resultPage;
     using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
     {
          resultPage = GetSearchResutlPage(response);  
     }
         IEnumerable<String> imageURIs = GetImageURIFromResultPage(resultPage) ;
          int currentURI=0;
        
          Int32 _downloaded=0;
          while (_downloaded < imageNumber && currentURI < imageURIs.Count())
          {
              InitiateWebRequest(ae, imageURIs.ElementAt(currentURI++));
              yield return 1;
              try
              {
                  using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
                  {
                      _GoogledImages.Add(GetImageFromResponse(response));
                      _downloaded++;
                  }
              }
              catch (Exception e)
              {
              }
          }
     yield  break;
    }
Пример #17
0
        private IEnumerator <Int32> UploadBlock(AsyncEnumerator ae, MemoryMappedFile mmf, CloudBlockBlob blob, Int32 blockNumber, Int64 length)
        {
            using (var stream = mmf.CreateViewStream(blockNumber * m_blockSize, length, MemoryMappedFileAccess.Read)) {
                blob.BeginPutBlock(blockNumber.ToBase64(), stream, null, ae.End(), null);
                yield return(1);

                blob.EndPutBlock(ae.DequeueAsyncResult());
            }
        }
Пример #18
0
        private IEnumerator <int> ProcessUpdateLookups(AsyncEnumerator asyncEnumerator, QuotePage[] pages)
        {
            QuotePage page;

            for (int i = 0; i < pages.Length; i++)
            {
                page = pages[i];
                LookupResolver.BeginNormalizeTopicOmitChecks(page.Topic, page.Culture,
                                                             asyncEnumerator.End(AsyncEnumeratorDiscardGroup, LookupResolver.EndNormalizeTopic), page);
            }

            IAsyncResult result;
            bool         updateQuotes = false;

            for (int i = 0; i < pages.Length; i++)
            {
                yield return(1);

                if (asyncEnumerator.IsCanceled())
                {
                    yield break;
                }

                result = asyncEnumerator.DequeueAsyncResult();
                page   = result.AsyncState as QuotePage;

                try
                {
                    page.Topic = LookupResolver.EndNormalizeTopic(result);
                    page.Uri   = LookupResolver.GetUri(page.Topic, page.Culture);
                }
                catch
                {
                    OnTopicNotFound(new TopicNotFoundEventArgs(page.Topic, page.Culture));
                    yield break;
                }

                lock (_lookupsInProgress)
                {
                    if (!_lookupsInProgress.Contains(page.Uri))
                    {
                        _lookupsInProgress.Add(page.Uri);
                        updateQuotes = true;
                    }
                }

                if (updateQuotes)
                {
                    QuoteCollector.UpdateQuotesAsync(page);
                }
            }

            lock (_asyncEnumerators)
            {
                _asyncEnumerators.Remove(asyncEnumerator);
            }
        }
Пример #19
0
        private IEnumerator <Int32> GetImagesFromGoogle(AsyncEnumerator ae, string searchUrl, Int32 imageNumber)
        {
            InitiateWebRequest(ae, searchUrl);
            yield return(1);

            String resultPage;

            _GoogledImages = new List <Image>();
            using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
            {
                resultPage = GetSearchResutlPage(response);
            }
            IEnumerable <String> imageURIs = GetImageURIFromResultPage(resultPage);
            int currentURI = 0;

            Int32 _downloaded = 0;
            //   while (_downloaded < imageNumber && currentURI < imageURIs.Count())
            int i = 0;

            while (i < 4)
            {
                InitiateWebRequest(ae, imageURIs.ElementAt(currentURI++));
                yield return(1);

                try
                {
                    using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
                    {
                        curImage = GetImageFromResponse(response);
                        _GoogledImages.Add(curImage);
                        _downloaded++;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("caught Webresponse exception" + e);
                }
                i++;
            }
            yield  break;
        }
Пример #20
0
        private IEnumerator <int> ProcessLookup(AsyncEnumerator asyncEnumerator, string topic, CultureInfo culture)
        {
            LookupResolver.BeginNormalizeTopicOmitChecks(topic, culture,
                                                         asyncEnumerator.End(AsyncEnumeratorDiscardGroup, LookupResolver.EndNormalizeTopic), null);

            yield return(1);

            if (asyncEnumerator.IsCanceled())
            {
                yield break;
            }

            try
            {
                topic = LookupResolver.EndNormalizeTopic(asyncEnumerator.DequeueAsyncResult());
            }
            catch
            {
                OnTopicNotFound(new TopicNotFoundEventArgs(topic, culture));
                yield break;
            }

            Uri  uri           = LookupResolver.GetUri(topic, culture);
            bool collectQuotes = false;

            lock (_playlist)
            {
                if (_playlist.Contains(uri))
                {
                    OnTopicAlreadyExists(new TopicAlreadyExistsEventArgs(topic, culture));
                    yield break;
                }
            }

            lock (_lookupsInProgress)
            {
                if (!_lookupsInProgress.Contains(uri))
                {
                    _lookupsInProgress.Add(uri);
                    collectQuotes = true;
                }
            }

            if (collectQuotes)
            {
                QuoteCollector.CollectQuotesAsync(topic, culture, uri);
            }

            lock (_asyncEnumerators)
            {
                _asyncEnumerators.Remove(asyncEnumerator);
            }
        }
Пример #21
0
      private static IEnumerator<Int32> CopyStream(AsyncEnumerator<Int64> ae, Stream source, Stream destination, Int32 bufferSize, Action<Int64> reportProgress) {
         Byte[] buffer = new Byte[bufferSize];
         Int64 totalBytesRead = 0;
         while (true) {
            ae.SetOperationTag("Reading from source stream");
            // Read whichever is smaller (number of bytes left to read OR the buffer size)
            source.BeginRead(buffer, 0, buffer.Length, ae.End(), null);
            yield return 1;
            Int32 bytesReadThisTime = source.EndRead(ae.DequeueAsyncResult());
            totalBytesRead += bytesReadThisTime;

            ae.SetOperationTag("Writing to destination stream");
            destination.BeginWrite(buffer, 0, bytesReadThisTime, ae.End(), null);
            yield return 1;
            destination.EndWrite(ae.DequeueAsyncResult());

            if (reportProgress != null) reportProgress(totalBytesRead);
            if (bytesReadThisTime < buffer.Length) break;
         }
         ae.Result = totalBytesRead;
      }
Пример #22
0
		private IEnumerator<Int32> GetImages(AsyncEnumerator ae)
		{
			ae.ThrowOnMissingDiscardGroup(true);

			// Request all the images asynchronously
			WebRequest[] requests = new WebRequest[]
			                        {
			                        	WebRequest.Create(_imageUris[0]),
			                        	WebRequest.Create(m_chkSimFailure.Checked ? _imageUris[2] : _imageUris[1])
			                        };

			for(Int32 n = 0; n < requests.Length; n++)
				requests[n].BeginGetResponse(
					ae.EndVoid(0, asyncResult => { requests[(Int32) asyncResult.AsyncState].EndGetResponse(asyncResult).Close(); }), n);

			// Set timeout if specified.
			Int32 timeout;
			if(Int32.TryParse(m_txtServerTime.Text, out timeout))
				ae.SetCancelTimeout(timeout, null);

			// WaitAsync for all operations to complete (or timeout)
			yield return requests.Length;
			if(ae.IsCanceled())
			{
				m_lblPic1.Text = "Server couldn't process the request in the specified time.";
				yield break;
			}

			for(Int32 n = 0; n < requests.Length; n++)
			{
				IAsyncResult result = ae.DequeueAsyncResult();
				Int32 reqNum = (Int32) result.AsyncState;
				Label lbl = (reqNum == 0) ? m_lblPic1 : m_lblPic2;
				WebRequest request = requests[reqNum];
				WebResponse response = null;
				try
				{
					response = request.EndGetResponse(result);
					lbl.Text = String.Format("Image at {0} is {1:N0} bytes",
					                         response.ResponseUri, response.ContentLength);
				}
				catch(WebException e)
				{
					lbl.Text = String.Format("Error obtaining image at {0}: {1}",
					                         request.RequestUri, e.Message);
				}
				finally
				{
					if(response != null) response.Close();
				}
			}
		}
Пример #23
0
        private IEnumerator <int> GetPostEnumerator(
            Uri uri, AsyncEnumerator ae, Action <JsonRpcResponse, Exception> resultCallback)
        {
            var webReq = (HttpWebRequest)WebRequest.Create(uri);

            webReq.Method      = "POST";
            webReq.ContentType = "text/json";
            webReq.BeginGetRequestStream(ae.End(), null);

            yield return(1);

            var reqStream = webReq.EndGetRequestStream(ae.DequeueAsyncResult());

            using (var sw = new StreamWriter(reqStream, Encoding.UTF8))
            {
                var json = JsonConvert.SerializeObject(this, Formatting.None);
                sw.Write(json);
                sw.Flush();
            }

            webReq.BeginGetResponse(ae.End(), null);

            yield return(1);

            try
            {
                using (var webRep = webReq.EndGetResponse(ae.DequeueAsyncResult()))
                    using (var repStream = webRep.GetResponseStream())
                    {
                        var jsonRep = JsonRpcResponse.Deserialize(repStream);
                        resultCallback(jsonRep, null);
                    }
            }
            catch (Exception ex)
            {
                resultCallback(null, ex);
                yield break;
            }
        }
Пример #24
0
 public static IEnumerator<int> GetInitData(SerializedInfo request,AsyncEnumerator ae)
 {
     Session session = request.ClientInfo.Session;
     Token token = SessionManager.Default.GetToken(session);
     Application.Default.StateServer.BeginGetInitData(token, null, ae.End(), null);
     yield return 1;
     try
     {
         int sequence;
         DataSet initData = Application.Default.StateServer.EndGetInitData(ae.DequeueAsyncResult(), out sequence);
         InitAndSendInitDataInPointer(request,initData);
     }
     catch (Exception ex)
     {
         SendErrorResult(request, ex);
     }
 }
Пример #25
0
 public IEnumerator<int> AsyncGetInitData(Token token,AsyncEnumerator ae)
 {
     Token currentToken = new Token(token.UserID, token.UserType, AppType.TradingConsole);
     Application.Default.StateServer.BeginGetInitData(currentToken, null, ae.End(), null);
     yield return 1;
     try
     {
         int commandSequence;
         DataSet initData = Application.Default.StateServer.EndGetInitData(ae.DequeueAsyncResult(), out commandSequence);
         OnLoadInitDataCompleted(initData);
     }
     catch (Exception ex)
     {
         _Logger.Error("async getInitData", ex);
         OnLoadInitDataCompleted(null);
         yield break;
     }
 }
Пример #26
0
        public static IEnumerator <int> GetInitData(SerializedInfo request, AsyncEnumerator ae)
        {
            Session session = request.ClientInfo.Session;
            Token   token   = SessionManager.Default.GetToken(session);

            Application.Default.StateServer.BeginGetInitData(token, null, ae.End(), null);
            yield return(1);

            try
            {
                int     sequence;
                DataSet initData = Application.Default.StateServer.EndGetInitData(ae.DequeueAsyncResult(), out sequence);
                InitAndSendInitDataInPointer(request, initData);
            }
            catch (Exception ex)
            {
                SendErrorResult(request, ex);
            }
        }
Пример #27
0
        public IEnumerator <int> AsyncGetInitData(Token token, AsyncEnumerator ae)
        {
            Token currentToken = new Token(token.UserID, token.UserType, AppType.TradingConsole);

            Application.Default.StateServer.BeginGetInitData(currentToken, null, ae.End(), null);
            yield return(1);

            try
            {
                int     commandSequence;
                DataSet initData = Application.Default.StateServer.EndGetInitData(ae.DequeueAsyncResult(), out commandSequence);
                OnLoadInitDataCompleted(initData);
            }
            catch (Exception ex)
            {
                _Logger.Error("async getInitData", ex);
                OnLoadInitDataCompleted(null);
                yield break;
            }
        }
        private IEnumerator <Int32> ExecuteWithAsyncEnumerator(AsyncEnumerator ae)
        {
            for (Int32 n = 0; n < c_iterations; n++)
            {
                ((WebService)m_webService).BeginGetStockQuotes(ae.End(), null);
            }

            // NOTE: AsyncEnumerator captures the calling thread's SynchronizationContext.
            // Set the Wintellect.Threading.AsyncProgModel.SynchronizationContext type to
            // null so that the callback continues on a ThreadPool thread.
            ae.SyncContext = null;

            yield return(c_iterations);

            for (Int32 n = 0; n < c_iterations; n++)
            {
                ((WebService)m_webService).EndGetStockQuotes(ae.DequeueAsyncResult());
            }

            // AsyncEnumerator captures the synchronization context.
            SetStatus("AsyncEnumerator completed.", StatusState.Ready);
        }
 private IEnumerator<Int32> GetImagesFromGoogle(AsyncEnumerator ae,string searchUrl,Int32 imageNumber)
 {
     InitiateWebRequest(ae,searchUrl);
     yield return 1;
     String resultPage;
       _GoogledImages = new List<Image>();
     using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
     {
          resultPage = GetSearchResutlPage(response);  
     }
         IEnumerable<String> imageURIs = GetImageURIFromResultPage(resultPage) ;
          int currentURI=0;
        
          Int32 _downloaded=0;
       //   while (_downloaded < imageNumber && currentURI < imageURIs.Count())
     int i=0;
            while(i<4)
          {
              InitiateWebRequest(ae, imageURIs.ElementAt(currentURI++));
              yield return 1;
              try
              {
                  using (WebResponse response = GetWebResponse(ae.DequeueAsyncResult()))
                  {
                      curImage=GetImageFromResponse(response);
                      _GoogledImages.Add(curImage);
                      _downloaded++;
                  }
              }
              catch (Exception e)
              {
                  Console.WriteLine("caught Webresponse exception" + e);
              }
              i++;
          }
     yield  break;
    }
Пример #30
0
        private IEnumerator <Int32> ExecuteWithAsyncEnumerator(AsyncEnumerator ae)
        {
            for (Int32 n = 0; n < c_iterations; n++)
            {
                Cargo cargo = CargoFactory.CreateNew("Glyfada" + n, "Perachora" + n);

                App.Database.BeginSave <Cargo>(cargo, ae.End(), null);
            }

            // NOTE: AsyncEnumerator captures the calling thread's SynchronizationContext.
            // Set the Wintellect.Threading.AsyncProgModel.SynchronizationContext type to
            // null so that the callback continues on a ThreadPool thread.
            ae.SyncContext = null;

            yield return(c_iterations);

            for (Int32 n = 0; n < c_iterations; n++)
            {
                App.Database.EndSave(ae.DequeueAsyncResult());
            }

            // AsyncEnumerator captures the synchronization context.
            SetStatus("AsyncEnumerator completed.", StatusState.Ready);
        }
Пример #31
0
        public static IEnumerator<int> ReadBytes(
            byte[] buffer, Stream stream, AsyncEnumerator ae, string type, bool expectedToHaveNoData)
        {
            var totalBytesRead = 0;

            while (totalBytesRead < buffer.Length)
            {
                stream.BeginRead(buffer, totalBytesRead, buffer.Length - totalBytesRead, ae.End(), null);

                yield return 1;

                int bytesRead = stream.EndRead(ae.DequeueAsyncResult());

                if(bytesRead == 0)
                {
                    if (expectedToHaveNoData)
                        yield break;

                    throw new InvalidOperationException("Could not read value for " + type);
                }

                totalBytesRead += bytesRead;
            }
        }
Пример #32
0
        static IEnumerator <int> ClientFiber(AsyncEnumerator ae, TcpClient clientSocket)
        {
            Console.WriteLine("ClientFibers ++{0}", Interlocked.Increment(ref clients));
            try
            {
                // original code to do handshaking and connect to remote host
                var ns1 = clientSocket.GetStream();
                var r1  = new BinaryReader(ns1);
                var w1  = new BinaryWriter(ns1);

                if (!(r1.ReadByte() == 5 && r1.ReadByte() == 1))
                {
                    yield break;
                }
                var c = r1.ReadByte();
                for (int i = 0; i < c; ++i)
                {
                    r1.ReadByte();
                }
                w1.Write((byte)5);
                w1.Write((byte)0);

                if (!(r1.ReadByte() == 5 && r1.ReadByte() == 1))
                {
                    yield break;
                }
                if (r1.ReadByte() != 0)
                {
                    yield break;
                }

                byte[] ipAddr   = null;
                string hostname = null;
                var    type     = r1.ReadByte();
                switch (type)
                {
                case 1:
                    ipAddr = r1.ReadBytes(4);
                    break;

                case 3:
                    hostname = Encoding.ASCII.GetString(r1.ReadBytes(r1.ReadByte()));
                    break;

                case 4:
                    throw new Exception();
                }
                var nhport    = r1.ReadInt16();
                var port      = IPAddress.NetworkToHostOrder(nhport);
                var socketout = new TcpClient();
                if (hostname != null)
                {
                    socketout.Connect(hostname, port);
                }
                else
                {
                    socketout.Connect(new IPAddress(ipAddr), port);
                }
                w1.Write((byte)5);
                w1.Write((byte)0);
                w1.Write((byte)0);
                w1.Write(type);
                switch (type)
                {
                case 1:
                    w1.Write(ipAddr);
                    break;

                case 3:
                    w1.Write((byte)hostname.Length);
                    w1.Write(Encoding.ASCII.GetBytes(hostname), 0, hostname.Length);
                    break;
                }
                w1.Write(nhport);
                using (var ns2 = socketout.GetStream())
                {
                    var forwardAe = new AsyncEnumerator()
                    {
                        SyncContext = null
                    };
                    forwardAe.BeginExecute(
                        ForwardingFiber(forwardAe, ns1, ns2), ae.EndVoid(0, forwardAe.EndExecute), null);
                    yield return(1);

                    if (ae.IsCanceled())
                    {
                        yield break;
                    }
                    forwardAe.EndExecute(ae.DequeueAsyncResult());
                }
            }
            finally
            {
                Console.WriteLine("ClientFibers --{0}", Interlocked.Decrement(ref clients));
            }
        }
Пример #33
0
        private IEnumerator <int> ProcessRequest(TcpClient client, AsyncEnumerator ae)
        {
            try
            {
                using (client)
                    using (var stream = client.GetStream())
                    {
                        var sender = client.Client.RemoteEndPoint;

                        var lenOfDataToReadBuffer = new byte[sizeof(int)];

                        var lenEnumerator = new AsyncEnumerator(ae.ToString());
                        try
                        {
                            lenEnumerator.BeginExecute(
                                StreamUtil.ReadBytes(lenOfDataToReadBuffer, stream, lenEnumerator, "length data", false), ae.End());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to read length data from " + sender, exception);
                            yield break;
                        }

                        yield return(1);

                        try
                        {
                            lenEnumerator.EndExecute(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to read length data from " + sender, exception);
                            yield break;
                        }

                        var lengthOfDataToRead = BitConverter.ToInt32(lenOfDataToReadBuffer, 0);
                        if (lengthOfDataToRead < 0)
                        {
                            logger.WarnFormat("Got invalid length {0} from sender {1}", lengthOfDataToRead, sender);
                            yield break;
                        }
                        logger.DebugFormat("Reading {0} bytes from {1}", lengthOfDataToRead, sender);

                        var buffer = new byte[lengthOfDataToRead];

                        var readBufferEnumerator = new AsyncEnumerator(ae.ToString());
                        try
                        {
                            readBufferEnumerator.BeginExecute(
                                StreamUtil.ReadBytes(buffer, stream, readBufferEnumerator, "message data", false), ae.End());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to read message data from " + sender, exception);
                            yield break;
                        }
                        yield return(1);

                        try
                        {
                            readBufferEnumerator.EndExecute(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to read message data from " + sender, exception);
                            yield break;
                        }

                        Message[] messages = null;
                        try
                        {
                            messages = SerializationExtensions.ToMessages(buffer);
                            logger.DebugFormat("Deserialized {0} messages from {1}", messages.Length, sender);
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Failed to deserialize messages from " + sender, exception);
                        }

                        if (messages == null)
                        {
                            try
                            {
                                stream.BeginWrite(ProtocolConstants.SerializationFailureBuffer, 0,
                                                  ProtocolConstants.SerializationFailureBuffer.Length, ae.End(), null);
                            }
                            catch (Exception exception)
                            {
                                logger.Warn("Unable to send serialization format error to " + sender, exception);
                                yield break;
                            }
                            yield return(1);

                            try
                            {
                                stream.EndWrite(ae.DequeueAsyncResult());
                            }
                            catch (Exception exception)
                            {
                                logger.Warn("Unable to send serialization format error to " + sender, exception);
                            }

                            yield break;
                        }

                        IMessageAcceptance acceptance = null;
                        byte[]             errorBytes = null;
                        try
                        {
                            acceptance = acceptMessages(messages);
                            logger.DebugFormat("All messages from {0} were accepted", sender);
                        }
                        catch (QueueDoesNotExistsException)
                        {
                            logger.WarnFormat("Failed to accept messages from {0} because queue does not exists", sender);
                            errorBytes = ProtocolConstants.QueueDoesNoExiststBuffer;
                        }
                        catch (Exception exception)
                        {
                            errorBytes = ProtocolConstants.ProcessingFailureBuffer;
                            logger.Warn("Failed to accept messages from " + sender, exception);
                        }

                        if (errorBytes != null)
                        {
                            try
                            {
                                stream.BeginWrite(errorBytes, 0,
                                                  errorBytes.Length, ae.End(), null);
                            }
                            catch (Exception exception)
                            {
                                logger.Warn("Unable to send processing failure from " + sender, exception);
                                yield break;
                            }
                            yield return(1);

                            try
                            {
                                stream.EndWrite(ae.DequeueAsyncResult());
                            }
                            catch (Exception exception)
                            {
                                logger.Warn("Unable to send processing failure from " + sender, exception);
                            }
                            yield break;
                        }

                        logger.DebugFormat("Sending reciept notice to {0}", sender);
                        try
                        {
                            stream.BeginWrite(ProtocolConstants.RecievedBuffer, 0, ProtocolConstants.RecievedBuffer.Length,
                                              ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Could not send reciept notice to " + sender, exception);
                            acceptance.Abort();
                            yield break;
                        }
                        yield return(1);

                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Could not send reciept notice to " + sender, exception);
                            acceptance.Abort();
                            yield break;
                        }

                        logger.DebugFormat("Reading acknowledgement about accepting messages to {0}", sender);

                        var acknowledgementBuffer = new byte[ProtocolConstants.AcknowledgedBuffer.Length];

                        var readAcknoweldgement = new AsyncEnumerator(ae.ToString());
                        try
                        {
                            readAcknoweldgement.BeginExecute(
                                StreamUtil.ReadBytes(acknowledgementBuffer, stream, readAcknoweldgement, "acknowledgement", false),
                                ae.End());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Error reading acknowledgement from " + sender, exception);
                            acceptance.Abort();
                            yield break;
                        }
                        yield return(1);

                        try
                        {
                            readAcknoweldgement.EndExecute(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Error reading acknowledgement from " + sender, exception);
                            acceptance.Abort();
                            yield break;
                        }

                        var senderResponse = Encoding.Unicode.GetString(acknowledgementBuffer);
                        if (senderResponse != ProtocolConstants.Acknowledged)
                        {
                            logger.WarnFormat("Sender did not respond with proper acknowledgement, the reply was {0}",
                                              senderResponse);
                            acceptance.Abort();
                        }

                        bool commitSuccessful;
                        try
                        {
                            acceptance.Commit();
                            commitSuccessful = true;
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to commit messages from " + sender, exception);
                            commitSuccessful = false;
                        }

                        if (commitSuccessful == false)
                        {
                            bool writeSuccessful;
                            try
                            {
                                stream.BeginWrite(ProtocolConstants.RevertBuffer, 0, ProtocolConstants.RevertBuffer.Length,
                                                  ae.End(),
                                                  null);
                                writeSuccessful = true;
                            }
                            catch (Exception e)
                            {
                                logger.Warn("Unable to send revert message to " + sender, e);
                                writeSuccessful = false;
                            }

                            if (writeSuccessful)
                            {
                                yield return(1);


                                try
                                {
                                    stream.EndWrite(ae.DequeueAsyncResult());
                                }
                                catch (Exception exception)
                                {
                                    logger.Warn("Unable to send revert message to " + sender, exception);
                                }
                            }
                        }
                    }
            }
            finally
            {
                var copy = CompletedRecievingMessages;
                if (copy != null)
                {
                    copy();
                }
            }
        }
Пример #34
0
        private IEnumerator <int> SendInternal(AsyncEnumerator ae)
        {
            try
            {
                using (var client = new TcpClient())
                {
                    try
                    {
                        client.BeginConnect(Destination.Host, Destination.Port,
                                            ae.End(),
                                            null);
                    }
                    catch (Exception exception)
                    {
                        logger.WarnFormat("Failed to connect to {0} because {1}", Destination, exception);
                        Failure(exception);
                        yield break;
                    }

                    yield return(1);

                    try
                    {
                        client.EndConnect(ae.DequeueAsyncResult());
                    }
                    catch (Exception exception)
                    {
                        logger.WarnFormat("Failed to connect to {0} because {1}", Destination, exception);
                        Failure(exception);
                        yield break;
                    }

                    logger.DebugFormat("Successfully connected to {0}", Destination);

                    using (var stream = client.GetStream())
                    {
                        var buffer = Messages.Serialize();

                        var bufferLenInBytes = BitConverter.GetBytes(buffer.Length);

                        logger.DebugFormat("Writing length of {0} bytes to {1}", buffer.Length, Destination);

                        try
                        {
                            stream.BeginWrite(bufferLenInBytes, 0, bufferLenInBytes.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return(1);

                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        logger.DebugFormat("Writing {0} bytes to {1}", buffer.Length, Destination);

                        try
                        {
                            stream.BeginWrite(buffer, 0, buffer.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return(1);

                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        logger.DebugFormat("Successfully wrote to {0}", Destination);

                        var recieveBuffer = new byte[ProtocolConstants.RecievedBuffer.Length];
                        var readConfirmationEnumerator = new AsyncEnumerator();

                        try
                        {
                            readConfirmationEnumerator.BeginExecute(
                                StreamUtil.ReadBytes(recieveBuffer, stream, readConfirmationEnumerator, "recieve confirmation", false), ae.End());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not read confirmation from {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return(1);

                        try
                        {
                            readConfirmationEnumerator.EndExecute(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not read confirmation from {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        var recieveRespone = Encoding.Unicode.GetString(recieveBuffer);
                        if (recieveRespone == ProtocolConstants.QueueDoesNotExists)
                        {
                            logger.WarnFormat(
                                "Response from reciever {0} is that queue does not exists",
                                Destination);
                            Failure(new QueueDoesNotExistsException());
                            yield break;
                        }
                        else if (recieveRespone != ProtocolConstants.Recieved)
                        {
                            logger.WarnFormat(
                                "Response from reciever {0} is not the expected one, unexpected response was: {1}",
                                Destination, recieveRespone);
                            Failure(null);
                            yield break;
                        }

                        try
                        {
                            stream.BeginWrite(ProtocolConstants.AcknowledgedBuffer, 0,
                                              ProtocolConstants.AcknowledgedBuffer.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Failed to write acknowledgement to reciever {0} because {1}",
                                              Destination, exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return(1);

                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Failed to write acknowledgement to reciever {0} because {1}",
                                              Destination, exception);
                            Failure(exception);
                            yield break;
                        }

                        var bookmarks = Success();

                        buffer = new byte[ProtocolConstants.RevertBuffer.Length];
                        var  readRevertMessage    = new AsyncEnumerator(ae.ToString());
                        bool startingToReadFailed = false;
                        try
                        {
                            readRevertMessage.BeginExecute(
                                StreamUtil.ReadBytes(buffer, stream, readRevertMessage, "revert", true), ae.End());
                        }
                        catch (Exception)
                        {
                            //more or less expected
                            startingToReadFailed = true;
                        }
                        if (startingToReadFailed)
                        {
                            yield break;
                        }
                        yield return(1);

                        try
                        {
                            readRevertMessage.EndExecute(ae.DequeueAsyncResult());
                            var revert = Encoding.Unicode.GetString(buffer);
                            if (revert == ProtocolConstants.Revert)
                            {
                                logger.Warn("Got back revert message from receiver, reverting send");
                                Revert(bookmarks);
                            }
                        }
                        catch (Exception)
                        {
                            // expected, there is nothing to do here, the
                            // reciever didn't report anything for us
                        }
                    }
                }
            }
            finally
            {
                var completed = SendCompleted;
                if (completed != null)
                {
                    completed();
                }
            }
        }
        private IEnumerator<Int32> DownloadImages(AsyncEnumerator ae)
        {
            ae.ThrowOnMissingDiscardGroup(true);
             GetImages.IsEnabled = false;
             Cancel.IsEnabled = true;
             WebRequest[] requests = new WebRequest[] {
            WebRequest.Create(UriHelper.ConvertRelativeUriStringToAbsolute("Images/Wintellect.jpg")),
            WebRequest.Create(UriHelper.ConvertRelativeUriStringToAbsolute("Images/JeffreyRichter.jpg")),
             };
             for (Int32 requestNum = 0; requestNum < requests.Length; requestNum++) {
            requests[requestNum].BeginGetResponse(
               ae.EndVoid(0, asyncResult => {
                  requests[requestNum].EndGetResponse(asyncResult).Close();
               }), requestNum);
             }

             for (Int32 resultNum = 0; resultNum < requests.Length; resultNum++) {
            yield return 1;
            if (ae.IsCanceled()) break;
            IAsyncResult asyncResult = ae.DequeueAsyncResult();
            Int32 index = (Int32)asyncResult.AsyncState;
            try {
               using (WebResponse response = requests[index].EndGetResponse(asyncResult)) {
                  using (Stream stream = response.GetResponseStream()) {
                     BitmapImage bitmapImage = new BitmapImage();
                     bitmapImage.SetSource(stream);
                     m_images[index].Source = bitmapImage;
                  }
               }
            }
            catch (WebException e) {
               m_textboxes[index].Text = "Failed: " + e.Message;
            }
             }
             GetImages.IsEnabled = true;
             Cancel.IsEnabled = false;
        }
Пример #36
0
        private static IEnumerator<int> GenerateTransferTask(
            AsyncEnumerator ae, HttpContext context, string url)
        {
            WebRequest request = WebRequest.Create(url);
            request.BeginGetResponse(ae.End(), null);
            yield return 1;

            using (WebResponse response = request.EndGetResponse(ae.DequeueAsyncResult()))
            {
                Stream streamIn = response.GetResponseStream();
                Stream streamOut = context.Response.OutputStream;
                byte[] buffer = new byte[1024];

                while (true)
                {
                    streamIn.BeginRead(buffer, 0, buffer.Length, ae.End(), null);
                    yield return 1;
                    int lengthRead = streamIn.EndRead(ae.DequeueAsyncResult());

                    if (lengthRead <= 0) break;

                    streamOut.BeginWrite(buffer, 0, lengthRead, ae.End(), null);
                    yield return 1;
                    streamOut.EndWrite(ae.DequeueAsyncResult());
                }
            }
        }
Пример #37
0
      private IEnumerator<Int32> GetPhotos(AsyncEnumerator ae, String input) {
         WebRequest request = HttpWebRequest.Create(
            new Uri(String.Format("http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key={0}&tags={1}&per_page=10", 
               FlickrKey.Key, input)));
         ae.SetOperationTag("Querying " + request.RequestUri);
         request.BeginGetResponse(ae.End(), null);
         yield return 1;
         // Complete the Flickr request (this is guaranteed to run on the GUI thread)
         String data;
         using (HttpWebResponse response = (HttpWebResponse) request.EndGetResponse(ae.DequeueAsyncResult())) {
            using (StreamReader reader = new StreamReader(response.GetResponseStream())) {
               data = reader.ReadToEnd();
            }
         }

         ae.SetOperationTag("Starting Storyboard");
         EventApmFactory<EventArgs> eventArgsFactory = new EventApmFactory<EventArgs>();
         EventHandler storyboardCompletedEventHandler = eventArgsFactory.PrepareOperation(ae.End()).EventHandler;
         SearchPanelStoryBoard.Completed += storyboardCompletedEventHandler;
         SearchPanelStoryBoard.Begin();
         yield return 1;

         SearchPanelStoryBoard.Completed -= storyboardCompletedEventHandler;
         eventArgsFactory.EndInvoke(ae.DequeueAsyncResult());
         PhotoBoard.Width = Application.Current.Host.Content.ActualWidth;
         PhotoBoard.Height = Application.Current.Host.Content.ActualHeight - 100.0;

         XDocument doc = XDocument.Parse(data);
         var photos = from results in doc.Descendants("photo")
                      select new {
                         id = results.Attribute("id").Value.ToString(),
                         farm = results.Attribute("farm").Value.ToString(),
                         server = results.Attribute("server").Value.ToString(),
                         secret = results.Attribute("secret").Value.ToString()
                      };

         PhotoBoard.Children.Clear();
         Int32 count = 0;

         EventApmFactory<OpenReadCompletedEventArgs> openReadCompletedEventArgsFactory = new EventApmFactory<OpenReadCompletedEventArgs>();
         foreach (var photo in photos) {
            // Create a photo
            Border item = (Border) XamlReader.Load(String.Format(CultureInfo.InvariantCulture,
                c_template, count,
                (PhotoBoard.Width - c_cx) / 2, (PhotoBoard.Height - c_cy) / 2,   // Initial position (center of workspace)
                c_cx + c_border, c_cy + c_border,                                // Width and height of photo border
                (c_cx + c_border) / 2, (c_cy + c_border) / 2,                    // Center of rotation
                c_cx, c_cy));                                                    // Width and height of photo


            WebClient wc = new WebClient();
            ae.SetOperationTag("Loading photo " + count);
            wc.OpenReadCompleted += openReadCompletedEventArgsFactory.PrepareOperation(ae.End()).EventHandler;
            wc.OpenReadAsync(
               new Uri(String.Format("http://farm{0}.static.flickr.com/{1}/{2}_{3}_m.jpg", photo.farm, photo.server, photo.id, photo.secret), 
                  UriKind.Absolute), item);
            count++;
         }
         while (count-- > 0) {
            yield return 1;  // Process each image as it comes back
            OnReadCompleted(null, openReadCompletedEventArgsFactory.EndInvoke(ae.DequeueAsyncResult()));
         }
      }
Пример #38
0
        static IEnumerator<Int32> Server(AsyncEnumerator ae, ServerState server)
        {
            var sleeper = new CountdownTimer();
            var settings = server.settings;
            var ipe = new IPEndPoint(IPAddress.Parse(settings.addressforward), settings.portforward);
            var serverSock = new TcpListener(IPAddress.Parse(settings.addresslisten), settings.portlisten);
            serverSock.Start(20);

            Console.WriteLine("Server started");
            Console.WriteLine("Listening on {0}:{1}", settings.addresslisten, settings.portlisten);
            Console.WriteLine("Forwarding to {0}:{1}", settings.addressforward, settings.portforward);
            while (true)
            {
                serverSock.BeginAcceptTcpClient(ae.End(), null);
                yield return 1;

                TcpClient local = null;
                try
                {
                    local = serverSock.EndAcceptTcpClient(ae.DequeueAsyncResult());
                    local.NoDelay = true;
                    local.LingerState.Enabled = false;
                }
                catch (SocketException)
                {
                    Console.WriteLine("A client failed to connect");
                }

                if(local != null)
                {
                    // handle client
                    var localAe = new AsyncEnumerator();
                    localAe.BeginExecute(ServerConnectRemote(localAe, server, ipe, local), localAe.EndExecute, localAe);
                }
            }
        }
Пример #39
0
        private static IEnumerator<Int32> Process(AsyncEnumerator ae, TcpListener server)
        {
            server.BeginAcceptTcpClient(ae.End(), null);
             yield return 1;

             using (TcpClient client = server.EndAcceptTcpClient(ae.DequeueAsyncResult())) {

            Start(server);  // Accept another client

            using (Stream stream = client.GetStream()) {
               // Read 1 byte from client which contains length of additional data
               Byte[] inputData = new Byte[1];
               stream.BeginRead(inputData, 0, 1, ae.End(), null);
               yield return 1;

               // Client closed connection; abandon this client request
               if (stream.EndRead(ae.DequeueAsyncResult()) == 0) yield break;

               // Start to read 'length' bytes of data from client
               Int32 dataLength = inputData[0];
               Array.Resize(ref inputData, 1 + dataLength);

               for (Byte bytesReadSoFar = 0; bytesReadSoFar < dataLength; ) {
                  stream.BeginRead(inputData, 1 + bytesReadSoFar,
                     inputData.Length - (bytesReadSoFar + 1), ae.End(), null);
                  yield return 1;

                  // Get number of bytes read from client
                  Int32 numBytesReadThisTime = stream.EndRead(ae.DequeueAsyncResult());
                  // Client closed connection; abandon this client request
                  if (numBytesReadThisTime == 0) yield break;

                  // Continue to read bytes from client until all bytes are in
                  bytesReadSoFar += (Byte)numBytesReadThisTime;
               }

               // All bytes have been read, process the input data
               Byte[] outputData = ProcessData(inputData);
               inputData = null;  // Allow early GC

               // Write outputData back to client
               stream.BeginWrite(outputData, 0, outputData.Length, ae.End(), null);
               yield return 1;

               stream.EndWrite(ae.DequeueAsyncResult());
            }
             }
        }
Пример #40
0
        private IEnumerator<int> ProcessRequest(TcpClient client, AsyncEnumerator ae)
        {
            try
            {
                using (client)
                using (var stream = client.GetStream())
                {
                    var sender = client.Client.RemoteEndPoint;

                    var lenOfDataToReadBuffer = new byte[sizeof(int)];

                    var lenEnumerator = new AsyncEnumerator(ae.ToString());
                    try
                    {
                        lenEnumerator.BeginExecute(
                            StreamUtil.ReadBytes(lenOfDataToReadBuffer, stream, lenEnumerator, "length data",false), ae.End());
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Unable to read length data from " + sender, exception);
                        yield break;
                    }

                    yield return 1;

                    try
                    {
                        lenEnumerator.EndExecute(ae.DequeueAsyncResult());
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Unable to read length data from " + sender, exception);
                        yield break;
                    }

                    var lengthOfDataToRead = BitConverter.ToInt32(lenOfDataToReadBuffer, 0);
                    if (lengthOfDataToRead < 0)
                    {
                        logger.WarnFormat("Got invalid length {0} from sender {1}", lengthOfDataToRead, sender);
                        yield break;
                    }
                    logger.DebugFormat("Reading {0} bytes from {1}", lengthOfDataToRead, sender);

                    var buffer = new byte[lengthOfDataToRead];

                    var readBufferEnumerator = new AsyncEnumerator(ae.ToString());
                    try
                    {
                        readBufferEnumerator.BeginExecute(
                            StreamUtil.ReadBytes(buffer, stream, readBufferEnumerator, "message data", false), ae.End());
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Unable to read message data from " + sender, exception);
                        yield break;
                    }
                    yield return 1;

                    try
                    {
                        readBufferEnumerator.EndExecute(ae.DequeueAsyncResult());
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Unable to read message data from " + sender, exception);
                        yield break;
                    }

                    Message[] messages = null;
                    try
                    {
                        messages = SerializationExtensions.ToMessages(buffer);
                        logger.DebugFormat("Deserialized {0} messages from {1}", messages.Length, sender);
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Failed to deserialize messages from " + sender, exception);
                    }

                    if (messages == null)
                    {
                        try
                        {
                            stream.BeginWrite(ProtocolConstants.SerializationFailureBuffer, 0,
                                              ProtocolConstants.SerializationFailureBuffer.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to send serialization format error to " + sender, exception);
                            yield break;
                        }
                        yield return 1;
                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to send serialization format error to " + sender, exception);
                        }

                        yield break;
                    }

                    IMessageAcceptance acceptance = null;
                    byte[] errorBytes = null;
                    try
                    {
                        acceptance = acceptMessages(messages);
                        logger.DebugFormat("All messages from {0} were accepted", sender);
                    }
                    catch (QueueDoesNotExistsException)
                    {
                        logger.WarnFormat("Failed to accept messages from {0} because queue does not exists", sender);
                        errorBytes = ProtocolConstants.QueueDoesNoExiststBuffer;
                    }
                    catch (Exception exception)
                    {
                        errorBytes = ProtocolConstants.ProcessingFailureBuffer;
                        logger.Warn("Failed to accept messages from " + sender, exception);
                    }

                    if (errorBytes != null)
                    {
                        try
                        {
                            stream.BeginWrite(errorBytes, 0,
                                              errorBytes.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to send processing failure from " + sender, exception);
                            yield break;
                        }
                        yield return 1;
                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.Warn("Unable to send processing failure from " + sender, exception);
                        }
                        yield break;
                    }

                    logger.DebugFormat("Sending reciept notice to {0}", sender);
                    try
                    {
                        stream.BeginWrite(ProtocolConstants.RecievedBuffer, 0, ProtocolConstants.RecievedBuffer.Length,
                                          ae.End(), null);
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Could not send reciept notice to " + sender, exception);
                        acceptance.Abort();
                        yield break;
                    }
                    yield return 1;

                    try
                    {
                        stream.EndWrite(ae.DequeueAsyncResult());
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Could not send reciept notice to " + sender, exception);
                        acceptance.Abort();
                        yield break;
                    }

                    logger.DebugFormat("Reading acknowledgement about accepting messages to {0}", sender);

                    var acknowledgementBuffer = new byte[ProtocolConstants.AcknowledgedBuffer.Length];

                    var readAcknoweldgement = new AsyncEnumerator(ae.ToString());
                    try
                    {
                        readAcknoweldgement.BeginExecute(
                            StreamUtil.ReadBytes(acknowledgementBuffer, stream, readAcknoweldgement, "acknowledgement", false),
                            ae.End());
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Error reading acknowledgement from " + sender, exception);
                        acceptance.Abort();
                        yield break;
                    }
                    yield return 1;
                    try
                    {
                        readAcknoweldgement.EndExecute(ae.DequeueAsyncResult());
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Error reading acknowledgement from " + sender, exception);
                        acceptance.Abort();
                        yield break;
                    }

                    var senderResponse = Encoding.Unicode.GetString(acknowledgementBuffer);
                    if (senderResponse != ProtocolConstants.Acknowledged)
                    {
                        logger.WarnFormat("Sender did not respond with proper acknowledgement, the reply was {0}",
                                          senderResponse);
                        acceptance.Abort();
                    }

                    bool commitSuccessful;
                    try
                    {
                        acceptance.Commit();
                        commitSuccessful = true;
                    }
                    catch (Exception exception)
                    {
                        logger.Warn("Unable to commit messages from " + sender, exception);
                        commitSuccessful = false;
                    }

                    if (commitSuccessful == false)
                    {
                        bool writeSuccessful;
                        try
                        {
                            stream.BeginWrite(ProtocolConstants.RevertBuffer, 0, ProtocolConstants.RevertBuffer.Length,
                                              ae.End(),
                                              null);
                            writeSuccessful = true;
                        }
                        catch (Exception e)
                        {
                            logger.Warn("Unable to send revert message to " + sender, e);
                            writeSuccessful = false;
                        }

                        if (writeSuccessful)
                        {
                            yield return 1;

                            try
                            {
                                stream.EndWrite(ae.DequeueAsyncResult());
                            }
                            catch (Exception exception)
                            {
                                logger.Warn("Unable to send revert message to " + sender, exception);
                            }
                        }
                    }
                }
            }
            finally
            {
                var copy = CompletedRecievingMessages;
                if (copy != null)
                    copy();
            }
        }
        private IEnumerator<Int32> ExecuteWithAsyncEnumerator(AsyncEnumerator ae)
        {
            for (Int32 n = 0; n < c_iterations; n++)
            {
                ((WebService)m_webService).BeginGetStockQuotes(ae.End(), null);
            }

            // NOTE: AsyncEnumerator captures the calling thread's SynchronizationContext.
            // Set the Wintellect.Threading.AsyncProgModel.SynchronizationContext type to
            // null so that the callback continues on a ThreadPool thread.
            ae.SyncContext = null;

            yield return c_iterations;

            for (Int32 n = 0; n < c_iterations; n++)
            {
                ((WebService)m_webService).EndGetStockQuotes(ae.DequeueAsyncResult());
            }

            // AsyncEnumerator captures the synchronization context.
            SetStatus("AsyncEnumerator completed.", StatusState.Ready);
        }
Пример #42
0
        public IEnumerator<int> AsyncLogin(LoginParameter parameter,AsyncEnumerator ae)
        {
            string connectionString = SettingManager.Default.ConnectionString;
            LoginInfo loginInfo = new LoginInfo() { Parameter=parameter};
            if (LoginRetryTimeHelper.IsFailedCountExceeded(parameter.LoginId, ParticipantType.Customer, connectionString))
            {
                loginInfo.Status = LoginStatus.ExceedMaxRetryCount;
                OnCompleted(loginInfo);
                yield break;
            }
            if (!parameter.LoginId.HasValue())
            {
                loginInfo.Status = LoginStatus.LoginIdIsEmpty;
                OnCompleted(loginInfo);
                yield break;
            }

            Application.Default.ParticipantService.BeginLogin(parameter.LoginId, parameter.Password,ae.End(), null);
            yield return 1;
            try
            {
                loginInfo.UserID = Application.Default.ParticipantService.EndLogin(ae.DequeueAsyncResult());
            }
            catch (Exception ex)
            {
                _Logger.Error(ex);
                loginInfo.Status = LoginStatus.ParticipantServiceLoginFailed;
                OnCompleted(loginInfo);
                yield break;
            }

            if (loginInfo.UserID == Guid.Empty)
            {
                loginInfo.Status = LoginStatus.UserIdIsEmpty;
                OnCompleted(loginInfo);
                yield break;
            }

            Guid programID = new Guid(SettingManager.Default.GetJavaTraderSettings("TradingConsole"));
            Guid permissionID = new Guid(SettingManager.Default.GetJavaTraderSettings("Run"));
            Application.Default.SecurityService.BeginCheckPermission(loginInfo.UserID, programID, permissionID, "", "", loginInfo.UserID, ae.End(), null);
            yield return 1;
            bool isAuthrized = false;
            try
            {
                string message;
                isAuthrized = Application.Default.SecurityService.EndCheckPermission(ae.DequeueAsyncResult(), out message);
            }
            catch (Exception ex)
            {
                _Logger.Error(ex);
                loginInfo.Status = LoginStatus.CheckPermissionFailed;
                OnCompleted(loginInfo);
                yield break;
            }

            if (!isAuthrized)
            {
                loginInfo.Status = LoginStatus.NotAuthrized;
                OnCompleted(loginInfo);
                yield break;
            }

            var token = new Token(Guid.Empty, UserType.Customer, parameter.AppType);
            token.UserID = loginInfo.UserID;
            token.SessionID = parameter.Request.ClientInfo.Session.ToString();
            SessionManager.Default.AddToken(parameter.Request.ClientInfo.Session, token);

            var stateServerCallToken = new Token
            {
                UserID = token.UserID,
                AppType = AppType.TradingConsole,
                SessionID = token.SessionID,
                UserType=token.UserType
            };

            Application.Default.StateServer.BeginLogin(stateServerCallToken, ae.End(), null);
            yield return 1;
            bool isStateServerLogined = false;
            try
            {
                isStateServerLogined = Application.Default.StateServer.EndLogin(ae.DequeueAsyncResult());
            }
            catch (Exception ex)
            {
                _Logger.Error(ex);
                loginInfo.Status = LoginStatus.StateServerLoginFailed;
                OnCompleted(loginInfo);
                yield break;
            }

            if (!isStateServerLogined)
            {
                loginInfo.Status = LoginStatus.StateServerNotLogined;
                OnCompleted(loginInfo);
                yield break;
            }
            loginInfo.Status = LoginStatus.Success;
            OnCompleted(loginInfo);
        }
Пример #43
0
        static IEnumerator<Int32> HandleClient(AsyncEnumerator ae,
                                               ServerState server,
                                               ClientState client,
                                               TcpClient tcpRecv,
                                               TcpClient tcpSend,
                                               BufferWrapper bw,
                                               FilterFunc filterFunc)
        {
            // add the client to the clients list
            {
                server.clientsMutex.BeginRegion(SyncGateMode.Exclusive, ae.End());
                yield return 1;
                var mutexResult = ae.DequeueAsyncResult();
                {
                    if (!server.clients.ContainsKey(client.localtcp))
                    {
                        server.clients[client.localtcp] = client;
                    }
                }
                server.clientsMutex.EndRegion(mutexResult);
            }

            Socket sockRecv = tcpRecv.Client;
            Socket sockSend = tcpSend.Client;
            bool wantDisconnect = false;
            int len = 0;
            while (true)
            {
                // read message
                try
                {
                    // resize buffer if needed so that it has initialbuffersize spaces at the end
                    if((bw.buffer.Length - len) < server.settings.initialbuffersize)
                    {
                        Array.Resize(ref bw.buffer, len + server.settings.initialbuffersize);
                    }

                    sockRecv.BeginReceive(bw.buffer, len, server.settings.initialbuffersize, SocketFlags.None, ae.End(), null);
                }
                catch (Exception)
                {
                    break;
                }

                yield return 1;

                try
                {
                    int tmplen = sockRecv.EndReceive(ae.DequeueAsyncResult());

                    if (tmplen == 0)
                    {
                        break;
                    }
                    else
                    {
                        len += tmplen;
                    }
                }
                catch (Exception)
                {
                    break;
                }

                // filter the packets here
                switch (filterFunc(client, bw.buffer, len))
                {
                    case FilterIntent.Buffer:
                        break;

                    case FilterIntent.Accept:
                        int sent = 0;
                        while(sent < len)
                        {
                            // echo the data back to the client
                            try
                            {
                                sockSend.BeginSend(bw.buffer, sent, len-sent, SocketFlags.None, ae.End(), null);
                            }
                            catch (Exception)
                            {
                                wantDisconnect = true;
                                break;
                            }
                            yield return 1;

                            try
                            {
                                sent += sockSend.EndSend(ae.DequeueAsyncResult());
                            }
                            catch (Exception)
                            {
                                wantDisconnect = true;
                                break;
                            }
                        }
                        len = 0;
                        break;

                    case FilterIntent.Drop:
                        len = 0;
                        break;

                    case FilterIntent.Disconnect:
                        wantDisconnect = true;
                        break;
                }

                if(wantDisconnect)
                    break;
            }

            // remove the client from the list
            {
                server.clientsMutex.BeginRegion(SyncGateMode.Exclusive, ae.End());
                yield return 1;
                var mutexResult = ae.DequeueAsyncResult();
                {
                    if (server.clients.ContainsKey(client.localtcp))
                    {
                        var removed = server.clients.Remove(client.localtcp);
                        Console.WriteLine("Client disconnected {0} - {1}", client.localtcp.Client.RemoteEndPoint, removed);

                        // dont forget to dispose it
                        tcpRecv.Close();
                        tcpSend.Close();
                    }
                }
                server.clientsMutex.EndRegion(mutexResult);
            }
        }
        private IEnumerator<Int32> Process(AsyncEnumerator ae)
        {
            StringBuilder sb = new StringBuilder();
            while (true)
            {
                if (charPos == charLen)
                {
                    do
                    {
                        charLen = 0;
                        charPos = 0;
                        byteLen = 0;

                        stream.BeginRead(byteBuffer, 0, byteBuffer.Length, ae.End(), null);
                        yield return 1;
                        byteLen = stream.EndRead(ae.DequeueAsyncResult());
                        if (byteLen == 0)
                        {
                            if (sb.Length > 0)
                            {
                                LineRead(this, sb.ToString());
                                sb.Length = 0;
                            }
                            EOFReached(this);
                            yield break;
                        }
                        charLen += decoder.GetChars(byteBuffer, 0, byteLen, charBuffer, charLen);
                    } while (charLen ==0);
                }
                int i = charPos;
                do
                {
                    char ch = charBuffer[i];
                    if (ch == '\r' || ch == '\n')
                    {
                        sb.Append(charBuffer, charPos, i - charPos);
                        charPos = i + 1;
                        if (ch == '\r' && (charPos < charLen )) //|| ReadBuffer() > 0)
                        {
                            if (charBuffer[charPos] == '\n')
                            {
                                charPos++;
                                i++;
                            }
                        }
                        LineRead(this, sb.ToString());
                        sb.Length=0;
                    }
                    i++;
                } while (i < charLen);
                i = charLen - charPos;
                sb.Append(charBuffer, charPos, i);
                charPos = charLen;
            }
        }
private IEnumerator<Int32> ExecuteWithAsyncEnumerator(AsyncEnumerator ae)
{
    for (Int32 n = 0; n < c_iterations; n++)
    {
        Cargo cargo = CargoFactory.CreateNew("Glyfada" + n, "Perachora" + n);

        App.Database.BeginSave<Cargo>(cargo, ae.End(), null);
    }

    // NOTE: AsyncEnumerator captures the calling thread's SynchronizationContext.
    // Set the Wintellect.Threading.AsyncProgModel.SynchronizationContext type to
    // null so that the callback continues on a ThreadPool thread.
    ae.SyncContext = null;

    yield return c_iterations;

    for (Int32 n = 0; n < c_iterations; n++)
    {
        App.Database.EndSave(ae.DequeueAsyncResult());
    }

    // AsyncEnumerator captures the synchronization context.
    SetStatus("AsyncEnumerator completed.", StatusState.Ready);
}
Пример #46
0
        private IEnumerator<int> SendInternal(AsyncEnumerator ae)
        {
            try
            {
                using (var client = new TcpClient())
                {
                    try
                    {
                        client.BeginConnect(Destination.Host, Destination.Port,
                                            ae.End(),
                                            null);
                    }
                    catch (Exception exception)
                    {
                        logger.WarnFormat("Failed to connect to {0} because {1}", Destination, exception);
                        Failure(exception);
                        yield break;
                    }

                    yield return 1;

                    try
                    {
                        client.EndConnect(ae.DequeueAsyncResult());
                    }
                    catch (Exception exception)
                    {
                        logger.WarnFormat("Failed to connect to {0} because {1}", Destination, exception);
                        Failure(exception);
                        yield break;
                    }

                    logger.DebugFormat("Successfully connected to {0}", Destination);

                    using (var stream = client.GetStream())
                    {
                        var buffer = Messages.Serialize();

                        var bufferLenInBytes = BitConverter.GetBytes(buffer.Length);

                        logger.DebugFormat("Writing length of {0} bytes to {1}", buffer.Length, Destination);

                        try
                        {
                            stream.BeginWrite(bufferLenInBytes, 0, bufferLenInBytes.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return 1;

                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        logger.DebugFormat("Writing {0} bytes to {1}", buffer.Length, Destination);

                        try
                        {
                            stream.BeginWrite(buffer, 0, buffer.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                            exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return 1;

                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not write to {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        logger.DebugFormat("Successfully wrote to {0}", Destination);

                        var recieveBuffer = new byte[ProtocolConstants.RecievedBuffer.Length];
                        var readConfirmationEnumerator = new AsyncEnumerator();

                        try
                        {
                            readConfirmationEnumerator.BeginExecute(
                                StreamUtil.ReadBytes(recieveBuffer, stream, readConfirmationEnumerator, "recieve confirmation", false), ae.End());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not read confirmation from {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return 1;

                        try
                        {
                            readConfirmationEnumerator.EndExecute(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Could not read confirmation from {0} because {1}", Destination,
                                              exception);
                            Failure(exception);
                            yield break;
                        }

                        var recieveRespone = Encoding.Unicode.GetString(recieveBuffer);
                        if (recieveRespone == ProtocolConstants.QueueDoesNotExists)
                        {
                            logger.WarnFormat(
                                "Response from reciever {0} is that queue does not exists",
                                Destination);
                            Failure(new QueueDoesNotExistsException());
                            yield break;
                        }
                        else if(recieveRespone!=ProtocolConstants.Recieved)
                        {
                            logger.WarnFormat(
                                "Response from reciever {0} is not the expected one, unexpected response was: {1}",
                                Destination, recieveRespone);
                            Failure(null);
                            yield break;
                        }

                        try
                        {
                            stream.BeginWrite(ProtocolConstants.AcknowledgedBuffer, 0,
                                              ProtocolConstants.AcknowledgedBuffer.Length, ae.End(), null);
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Failed to write acknowledgement to reciever {0} because {1}",
                                              Destination, exception);
                            Failure(exception);
                            yield break;
                        }

                        yield return 1;

                        try
                        {
                            stream.EndWrite(ae.DequeueAsyncResult());
                        }
                        catch (Exception exception)
                        {
                            logger.WarnFormat("Failed to write acknowledgement to reciever {0} because {1}",
                                              Destination, exception);
                            Failure(exception);
                            yield break;
                        }

                        var bookmarks = Success();

                        buffer = new byte[ProtocolConstants.RevertBuffer.Length];
                        var readRevertMessage = new AsyncEnumerator(ae.ToString());
                        bool startingToReadFailed = false;
                        try
                        {
                            readRevertMessage.BeginExecute(
                                StreamUtil.ReadBytes(buffer, stream, readRevertMessage, "revert", true), ae.End());
                        }
                        catch (Exception)
                        {
                            //more or less expected
                            startingToReadFailed = true;
                        }
                        if (startingToReadFailed)
                            yield break;
                        yield return 1;
                        try
                        {
                            readRevertMessage.EndExecute(ae.DequeueAsyncResult());
                            var revert = Encoding.Unicode.GetString(buffer);
                            if (revert == ProtocolConstants.Revert)
                            {
                                logger.Warn("Got back revert message from receiver, reverting send");
                                Revert(bookmarks);
                            }
                        }
                        catch (Exception)
                        {
                            // expected, there is nothing to do here, the
                            // reciever didn't report anything for us
                        }

                    }
                }
            }
            finally
            {
                var completed = SendCompleted;
                if (completed != null)
                    completed();
            }
        }
Пример #47
0
        private IEnumerator <int> ProcessCollectQuotes(AsyncEnumerator asyncEnumerator, string topic, CultureInfo culture, Uri uri, AssignQuotePageDataDelegate assignQuotesDelegate)
        {
            Uri quoteSourceUri = GetQuoteSourceUri(culture, topic);

            Util.BeginFetchXmlPage(quoteSourceUri, asyncEnumerator.End(AsyncEnumeratorDiscardGroup, Util.EndFetchXmlPage), null);

            yield return(1);

            if (asyncEnumerator.IsCanceled())
            {
                yield break;
            }

            string contents;

            try
            {
                XDocument xDocument = Util.EndFetchXmlPage(asyncEnumerator.DequeueAsyncResult());

                if (xDocument == null)
                {
                    throw new NullReferenceException();
                }

                // extracting the page contents
                contents = GetXmlPageContents(xDocument);
            }
            catch (Exception ex)
            {
                OnErrorCollectingQuotes(new ErrorCollectingQuotesEventArgs(topic, culture, uri, ex));
                yield break;
            }

            IAsyncResult getQuotesResult = BeginParsePageContentsAndExtractQuotes(topic, culture, contents, null,
                                                                                  asyncEnumerator.End(AsyncEnumeratorDiscardGroup, EndParsePageContentsAndExtractQuotes), null);
            IAsyncResult getTopicTranslationsResult = BeginExtractTopicTranslations(contents,
                                                                                    asyncEnumerator.End(AsyncEnumeratorDiscardGroup, EndExtractTopicTranslations), null);

            yield return(2);

            if (asyncEnumerator.IsCanceled())
            {
                yield break;
            }

            try
            {
                TopicTranslation[]        topicTranslations = EndExtractTopicTranslations(getTopicTranslationsResult);
                SelectableQuoteCollection quotes            = EndParsePageContentsAndExtractQuotes(getQuotesResult);

                if (quotes.Count == 0)
                {
                    OnNoQuotesCollected(new NoQuotesCollectedEventArgs(topic, culture, uri));

                    // Change by Ming Slogar on 26Apr2014 at 20:25
                    // Reason: The following line prevents the topic from being returned
                    //		when it has no listed quotes.
                    //yield break;
                }

                assignQuotesDelegate.Invoke(quotes, topicTranslations);
            }
            catch (TopicAmbiguousException ex)
            {
                OnTopicAmbiguous(new TopicAmbiguousEventArgs(topic, culture, uri, ex.TopicChoices));
                yield break;
            }
            catch (Exception ex)
            {
                OnErrorCollectingQuotes(new ErrorCollectingQuotesEventArgs(topic, culture, uri, ex));
                yield break;
            }
            finally
            {
                // cleanup
                asyncEnumerator.DequeueAsyncResult();
                asyncEnumerator.DequeueAsyncResult();

                lock (asyncEnumerator)
                {
                    _asyncEnumerators.Remove(asyncEnumerator);
                }
            }
        }
Пример #48
0
        public IEnumerator <int> AsyncLogin(LoginParameter parameter, AsyncEnumerator ae)
        {
            string    connectionString = SettingManager.Default.ConnectionString;
            LoginInfo loginInfo        = new LoginInfo()
            {
                Parameter = parameter
            };

            if (LoginRetryTimeHelper.IsFailedCountExceeded(parameter.LoginId, ParticipantType.Customer, connectionString))
            {
                loginInfo.Status = LoginStatus.ExceedMaxRetryCount;
                OnCompleted(loginInfo);
                yield break;
            }
            if (!parameter.LoginId.HasValue())
            {
                loginInfo.Status = LoginStatus.LoginIdIsEmpty;
                OnCompleted(loginInfo);
                yield break;
            }

            Application.Default.ParticipantService.BeginLogin(parameter.LoginId, parameter.Password, ae.End(), null);
            yield return(1);

            try
            {
                loginInfo.UserID = Application.Default.ParticipantService.EndLogin(ae.DequeueAsyncResult());
            }
            catch (Exception ex)
            {
                _Logger.Error(ex);
                loginInfo.Status = LoginStatus.ParticipantServiceLoginFailed;
                OnCompleted(loginInfo);
                yield break;
            }

            if (loginInfo.UserID == Guid.Empty)
            {
                loginInfo.Status = LoginStatus.UserIdIsEmpty;
                OnCompleted(loginInfo);
                yield break;
            }

            Guid programID    = new Guid(SettingManager.Default.GetJavaTraderSettings("TradingConsole"));
            Guid permissionID = new Guid(SettingManager.Default.GetJavaTraderSettings("Run"));

            Application.Default.SecurityService.BeginCheckPermission(loginInfo.UserID, programID, permissionID, "", "", loginInfo.UserID, ae.End(), null);
            yield return(1);

            bool isAuthrized = false;

            try
            {
                string message;
                isAuthrized = Application.Default.SecurityService.EndCheckPermission(ae.DequeueAsyncResult(), out message);
            }
            catch (Exception ex)
            {
                _Logger.Error(ex);
                loginInfo.Status = LoginStatus.CheckPermissionFailed;
                OnCompleted(loginInfo);
                yield break;
            }

            if (!isAuthrized)
            {
                loginInfo.Status = LoginStatus.NotAuthrized;
                OnCompleted(loginInfo);
                yield break;
            }

            var token = new Token(Guid.Empty, UserType.Customer, parameter.AppType);

            token.UserID    = loginInfo.UserID;
            token.SessionID = parameter.Request.ClientInfo.Session.ToString();
            SessionManager.Default.AddToken(parameter.Request.ClientInfo.Session, token);

            var stateServerCallToken = new Token
            {
                UserID    = token.UserID,
                AppType   = AppType.TradingConsole,
                SessionID = token.SessionID,
                UserType  = token.UserType
            };

            Application.Default.StateServer.BeginLogin(stateServerCallToken, ae.End(), null);
            yield return(1);

            bool isStateServerLogined = false;

            try
            {
                isStateServerLogined = Application.Default.StateServer.EndLogin(ae.DequeueAsyncResult());
            }
            catch (Exception ex)
            {
                _Logger.Error(ex);
                loginInfo.Status = LoginStatus.StateServerLoginFailed;
                OnCompleted(loginInfo);
                yield break;
            }

            if (!isStateServerLogined)
            {
                loginInfo.Status = LoginStatus.StateServerNotLogined;
                OnCompleted(loginInfo);
                yield break;
            }
            loginInfo.Status = LoginStatus.Success;
            OnCompleted(loginInfo);
        }
Пример #49
0
 private static IEnumerator<Int32> FetchStockQuotesAsyncEnumerator(AsyncEnumerator ae, WebService svc)
 {
     svc.BeginFetchStockQuotes(ae.End(), null);
     yield return 1;
     IStockQuote qt = svc.EndFetchStockQuotes(ae.DequeueAsyncResult());
 }
Пример #50
0
        private static IEnumerator<Int32> Process(AsyncEnumerator ae, String server, String message)
        {
            TcpClient client = new TcpClient(server, 12000);
             Stream stream = client.GetStream();
             Byte[] outputString = Encoding.UTF8.GetBytes(message);
             Byte[] outputData = new Byte[1 + outputString.Length];
             outputData[0] = (Byte)outputString.Length;
             Array.Copy(outputString, 0, outputData, 1, outputString.Length);

             stream.BeginWrite(outputData, 0, outputData.Length, ae.End(), null);
             yield return 1;

             stream.EndWrite(ae.DequeueAsyncResult());

             Byte[] inputData = new Byte[1 + 255];
             stream.BeginRead(inputData, 0, 1, ae.End(), null);
             yield return 1;

             // Server closed connection
             if (stream.EndRead(ae.DequeueAsyncResult()) == 0) { client.Close(); yield break; }

             // Start to read 'length' bytes of data from server
             Int32 dataLength = inputData[0];
             Array.Resize(ref inputData, 1 + dataLength);

             Int32 bytesReadSoFar = 0;
             while (bytesReadSoFar < dataLength) {
            stream.BeginRead(inputData, 1, dataLength, ae.End(), null);
            yield return 1;

            // Get number of bytes read from server
            Int32 numBytesReadThisTime = stream.EndRead(ae.DequeueAsyncResult());

            // Server closed connection
            if (numBytesReadThisTime == 0) { client.Close(); yield break; }

            // Continue to read bytes from server until all bytes are in
            bytesReadSoFar += (Byte)numBytesReadThisTime;

             }

             // All bytes have been read, Show the server's result
             String result = Encoding.UTF8.GetString(inputData, 1, inputData[0]);
             Console.WriteLine("Received={0}", result);
             client.Close();
        }
Пример #51
0
        private IEnumerator <Int32> UploadFileInBlocks(AsyncEnumerator ae, String pathname, CloudBlockBlob blob, Action <Int32> blockUploaded)
        {
            Int64 fileLength;

            using (var fs = new FileStream(pathname, FileMode.Open, FileAccess.Read, FileShare.Read))
                using (var mmf = MemoryMappedFile.CreateFromFile(fs, null, fileLength = fs.Length, MemoryMappedFileAccess.Read, null, HandleInheritability.None, false)) {
                    Byte[] uploadedBlocks = new Byte[(fileLength - 1) / m_blockSize + 1];

                    // Find out which blocks have been uploaded already?
                    blob.BeginDownloadBlockList(BlockListingFilter.Uncommitted, AccessCondition.GenerateEmptyCondition(), null, null, ae.End(), null);
                    yield return(1);

                    try {
                        foreach (ListBlockItem lbi in blob.EndDownloadBlockList(ae.DequeueAsyncResult()))
                        {
                            Int32 blockId = lbi.Name.FromBase64ToInt32();
                            uploadedBlocks[blockId] = 1;
                            blockUploaded(blockId);
                        }
                    }
                    catch (StorageException e) {
                        if ((HttpStatusCode)e.RequestInformation.HttpStatusCode != HttpStatusCode.NotFound)
                        {
                            throw;
                        }
                    }

                    // Start uploading the remaining blocks:
                    Int32 blocksUploading = 0;

                    foreach (var blockNumber in GetBlockNumbersFromArray(uploadedBlocks))
                    {
                        // Start uploading up to 'm_concurrency' blocks
                        blocksUploading++;
                        var aeBlock = new AsyncEnumerator("Block #" + blockNumber);
                        aeBlock.BeginExecute(UploadBlock(aeBlock, mmf, blob, blockNumber,
                                                         (blockNumber == uploadedBlocks.Length - 1) ? fileLength % m_blockSize : m_blockSize), ae.End(), blockNumber);
                        if (blocksUploading < m_concurrency)
                        {
                            continue;
                        }

                        // As each block completes uploading, start uploading a new block (if any are left)
                        yield return(1);

                        blocksUploading--;
                        IAsyncResult result = ae.DequeueAsyncResult();
                        AsyncEnumerator.FromAsyncResult(result).EndExecute(result);
                        blockUploaded((Int32)result.AsyncState);
                    }

                    // Wait until all blocks have finished uploading and then commit them all
                    for (; blocksUploading > 0; blocksUploading--)
                    {
                        yield return(1);

                        IAsyncResult result = ae.DequeueAsyncResult();
                        AsyncEnumerator.FromAsyncResult(result).EndExecute(result);
                        blockUploaded((Int32)result.AsyncState);
                    }

                    // Commit all the blocks in order:
                    blob.BeginPutBlockList(Enumerable.Range(0, uploadedBlocks.Length).Select(b => b.ToBase64()), ae.End(), null);
                    yield return(1);

                    blob.EndPutBlockList(ae.DequeueAsyncResult());
                }
        }
        private IEnumerator <Int32> GetImages(AsyncEnumerator ae)
        {
            ae.ThrowOnMissingDiscardGroup(true);

            // Request all the images asynchronously
            WebRequest[] requests = new WebRequest[]
            {
                WebRequest.Create(_imageUris[0]),
                WebRequest.Create(m_chkSimFailure.Checked ? _imageUris[2] : _imageUris[1])
            };

            for (Int32 n = 0; n < requests.Length; n++)
            {
                requests[n].BeginGetResponse(
                    ae.EndVoid(0, asyncResult => { requests[(Int32)asyncResult.AsyncState].EndGetResponse(asyncResult).Close(); }), n);
            }

            // Set timeout if specified.
            Int32 timeout;

            if (Int32.TryParse(m_txtServerTime.Text, out timeout))
            {
                ae.SetCancelTimeout(timeout, null);
            }

            // WaitAsync for all operations to complete (or timeout)
            yield return(requests.Length);

            if (ae.IsCanceled())
            {
                m_lblPic1.Text = "Server couldn't process the request in the specified time.";
                yield break;
            }

            for (Int32 n = 0; n < requests.Length; n++)
            {
                IAsyncResult result   = ae.DequeueAsyncResult();
                Int32        reqNum   = (Int32)result.AsyncState;
                Label        lbl      = (reqNum == 0) ? m_lblPic1 : m_lblPic2;
                WebRequest   request  = requests[reqNum];
                WebResponse  response = null;
                try
                {
                    response = request.EndGetResponse(result);
                    lbl.Text = String.Format("Image at {0} is {1:N0} bytes",
                                             response.ResponseUri, response.ContentLength);
                }
                catch (WebException e)
                {
                    lbl.Text = String.Format("Error obtaining image at {0}: {1}",
                                             request.RequestUri, e.Message);
                }
                finally
                {
                    if (response != null)
                    {
                        response.Close();
                    }
                }
            }
        }
Пример #53
0
        // Because SyncContext is set, all the iterator code runs on the GUI thread
        private IEnumerator<Int32> GetWebData(AsyncEnumerator ae, String[] uris)
        {
            ToggleStartAndCancelButtonState(false);
             m_lbResults.Items.Clear();

             // Auto-cancel after 5 seconds if the user desires
             if (m_chkAutoCancel.Checked)
            ae.SetCancelTimeout(5000, ae);

             // Issue several web requests (all in discard group 0) simultaneously
             foreach (String uri in uris) {
            WebRequest webRequest = WebRequest.Create(uri);

            // If the AsyncEnumerator is canceled, DiscardWebRequest cleans-up
            // any outstanding operations as they complete in the future
            webRequest.BeginGetResponse(ae.EndVoid(0, DiscardWebRequest), webRequest);
             }

             yield return uris.Length;  // Process the completed web requests after all complete

             String resultStatus; // Ultimate result of processing shown to user

             // Check if iterator was canceled
             Object cancelValue;
             if (ae.IsCanceled(out cancelValue)) {
            // Tell the AE to auto-cleanup any operations issued as part of discard group 0
            ae.DiscardGroup(0);
            // Note: In this example calling DiscardGroup above is not mandatory
            // because the whole iterator is stopping execution; causing all
            // discard groups to be discarded automatically.

            resultStatus = (cancelValue == ae) ? "Timeout" : "User canceled";
            goto Complete;
             }

             // Iterator wasn't canceled, process all the completed operations
             for (Int32 n = 0; n < uris.Length; n++) {
            // Grab the result of a completed web request
            IAsyncResult result = ae.DequeueAsyncResult();

            // Get the WebRequest object used to initate the request
            // (see BeginGetResponse's last argument above)
            WebRequest webRequest = (WebRequest)result.AsyncState;

            // Build the String showing the result of this completed web request
            String s = "URI=" + webRequest.RequestUri + ", ";
            try {
               using (WebResponse webResponse = webRequest.EndGetResponse(result)) {
                  s += "ContentLength=" + webResponse.ContentLength;
               }
            }
            catch (WebException e) {
               s += "Error=" + e.Message;
            }
            m_lbResults.Items.Add(s);  // Add result of operation to listbox
             }
             resultStatus = "All operations completed.";

              Complete:
             // All operations have completed or cancelation occurred, tell user
             MessageBox.Show(this, resultStatus);

             // Reset everything so that the user can start over if they desire
             m_ae = null;   // Reset since we're done
             ToggleStartAndCancelButtonState(true);
        }
Пример #54
0
        static IEnumerator<Int32> ServerConnectRemote(AsyncEnumerator ae, ServerState server, IPEndPoint ipe, TcpClient local)
        {
            // establish a client proxy -> real server connection

            var remote = new TcpClient(ipe.AddressFamily);
            var settings = server.settings;
            remote.NoDelay = true;
            remote.LingerState.Enabled = false;

            remote.BeginConnect(IPAddress.Parse(settings.addressforward), settings.portforward, ae.End(), ae);
            yield return 1;

            try
            {
                remote.EndConnect(ae.DequeueAsyncResult());
            }
            catch (SocketException)
            {
                Console.WriteLine("A client failed to connect, has the real server started?");
                local.Close();
                remote.Close();
                remote = null;
            }

            if(remote != null)
            {
                var bufParam = new ClientBufferParam();

                {
                    server.bufferPoolMutex.BeginRegion(SyncGateMode.Exclusive, ae.End());
                    yield return 1;
                    var res = ae.DequeueAsyncResult();
                    server.AllocBuffer(ae, bufParam);
                    server.bufferPoolMutex.EndRegion(res);
                }

                {
                    var newClientState = new ClientState(local, remote);
                    var remoteAe = new AsyncEnumerator();
                    var localAe = new AsyncEnumerator();
                    var bw1 = new BufferWrapper(bufParam.sendbuffer);
                    var bw2 = new BufferWrapper(bufParam.recvbuffer);
                    localAe.BeginExecute(HandleClient(localAe, server, newClientState, local, remote, bw1, server.filterSend), ae.End(), localAe);
                    remoteAe.BeginExecute(HandleClient(remoteAe, server, newClientState, remote, local, bw2, server.filterRecv), ae.End(), remoteAe);

                    Console.WriteLine("Client Connected {0}", local.Client.RemoteEndPoint);

                    yield return 2;
                    for (int x = 0; x < 2; x++)
                    {
                        IAsyncResult ar = ae.DequeueAsyncResult();
                        ((AsyncEnumerator)ar.AsyncState).EndExecute(ar);
                    }
                    bufParam.sendbuffer = bw1.buffer;
                    bufParam.recvbuffer = bw2.buffer;
                }

                {
                    server.bufferPoolMutex.BeginRegion(SyncGateMode.Exclusive, ae.End());
                    yield return 1;
                    var res = ae.DequeueAsyncResult();
                    server.FreeBuffer(ae, bufParam);
                    server.bufferPoolMutex.EndRegion(res);
                }
            }
        }
Пример #55
0
        static IEnumerator <int> ForwardingFiber(AsyncEnumerator ae, NetworkStream inputStream, NetworkStream outputStream)
        {
            while (!ae.IsCanceled())
            {
                byte[] outputRead = new byte[bufsize], outputWrite = new byte[bufsize];
                byte[] inputRead  = new byte[bufsize], inputWrite = new byte[bufsize];
                // start off output and input reads.
                // NB ObjectDisposedExceptions can be raised here when a socket is closed while an async read is in progress.
                outputStream.BeginRead(outputRead, 0, bufsize, ae.End(1, ar => outputStream.EndRead(ar)), Operation.OutboundRead);
                inputStream.BeginRead(inputRead, 0, bufsize, ae.End(1, ar => inputStream.EndRead(ar)), Operation.InboundRead);
                var pendingops = 2;
                while (!ae.IsCanceled())
                {
                    // wait for the next operation to complete, the state object passed to each async
                    // call can be used to find out what completed.
                    if (pendingops == 0)
                    {
                        yield break;
                    }
                    yield return(1);

                    if (!ae.IsCanceled())
                    {
                        int byteCount;
                        var latestEvent = ae.DequeueAsyncResult();
                        var currentOp   = (Operation)latestEvent.AsyncState;
                        if (currentOp == Operation.InboundRead)
                        {
                            byteCount = inputStream.EndRead(latestEvent);
                            if (byteCount == 0)
                            {
                                pendingops--;
                                outputStream.Close();
                                continue;
                            }
                            Array.Copy(inputRead, outputWrite, byteCount);
                            outputStream.BeginWrite(outputWrite, 0, byteCount, ae.EndVoid(1, outputStream.EndWrite), Operation.OutboundWrite);
                            inputStream.BeginRead(inputRead, 0, bufsize, ae.End(1, ar => inputStream.EndRead(ar)), Operation.InboundRead);
                        }
                        else if (currentOp == Operation.OutboundRead)
                        {
                            byteCount = outputStream.EndRead(latestEvent);
                            if (byteCount == 0)
                            {
                                pendingops--;
                                inputStream.Close();
                                continue;
                            }
                            Array.Copy(outputRead, inputWrite, byteCount);
                            inputStream.BeginWrite(inputWrite, 0, byteCount, ae.EndVoid(1, inputStream.EndWrite), Operation.InboundWrite);
                            outputStream.BeginRead(outputRead, 0, bufsize, ae.End(1, ar => outputStream.EndRead(ar)), Operation.OutboundRead);
                        }
                        else if (currentOp == Operation.InboundWrite)
                        {
                            inputStream.EndWrite(latestEvent);
                        }
                        else if (currentOp == Operation.OutboundWrite)
                        {
                            outputStream.EndWrite(latestEvent);
                        }
                    }
                }
            }
        }