Beispiel #1
0
 private void OnSendCompleted()
 {
     if (SendCompleted != null)
     {
         SendCompleted.Invoke(this, new EventArgs());
     }
 }
Beispiel #2
0
 protected void OnSendCompleted(AsyncCompletedEventArgs e)
 {
     if (SendCompleted != null)
     {
         SendCompleted.Invoke(this, e);
     }
 }
Beispiel #3
0
 private void OnSendToGame(string address, byte[] data)
 {
     if (SendCompleted != null)
     {
         //分发到游戏服
         SendCompleted.BeginInvoke(address, data, null, null);
     }
 }
Beispiel #4
0
            public void Send()
            {
                var emailServer = new EmailServer();

                _pendings.AsParallel().ForAll(m =>
                {
                    emailServer.Send(m);
                    SendCompleted?.Invoke(this, m);
                });
            }
        private void SendItems(List <SendItem> sendItemList)
        {
            if (sendItemList.Count < 0)
            {
                return;
            }

            var historyGroup = _liteDb.Database.GetCollection <HistoryGroup>().FindById(_currentHistoryGroupId);

            // 添加到栈中
            Stack <SendItem> sendItemStack = new Stack <SendItem>();

            // 栈是先进后出,所以要倒转一下
            sendItemList.Reverse();
            sendItemList.ForEach(item => sendItemStack.Push(item));

            // 获取发件人
            List <SendBox> senders = _liteDb.Fetch <SendBox>(sb => historyGroup.senderIds.Contains(sb._id));

            // 开始发送邮件,采用异步进行发送
            // 一个发件箱对应一个异步
            List <SendThread> sendThreads = senders.ConvertAll(sender =>
            {
                var sendThread            = new SendThread(_userId, sender, _liteDb);
                sendThread.SendCompleted += SendThread_SendCompleted;
                return(sendThread);
            });

            // 开始运行
            Task.WhenAll(sendThreads.ConvertAll(st => st.Run(sendItemStack))).ContinueWith((task) =>
            {
                // 执行回调
                // 发送关闭命令
                SendStatus = SendStatus.SendFinish;

                // 对于已经完成的,要更新数据的状态
                var history = _liteDb.SingleById <HistoryGroup>(_currentHistoryGroupId);
                if (history != null)
                {
                    // 更新状态
                    history.sendStatus = SendStatus.SendFinish;
                    _liteDb.Update(history);
                }

                // 发送完成数据
                SendingProgressInfo = new SendingProgressInfo()
                {
                    historyId = _currentHistoryGroupId,
                    index     = sendItemList.Count,
                    total     = sendItemList.Count,
                };

                SendCompleted?.Invoke();
            });
        }
Beispiel #6
0
 private void ProcessSend(SocketAsyncEventArgs e)
 {
     if (e.SocketError == SocketError.Success)
     {
         SendCompleted?.Invoke(this, null);
         OnSending();
     }
     else
     {
         CloseClientSocket(e);
     }
 }
Beispiel #7
0
 protected void OnSendCompleted(string clientAddress, byte[] data)
 {
     if (SendCompleted != null)
     {
         string successMsg = string.Format("{0}>>准备发送到{1}的字节数:{2}byte...",
                                           DateTime.Now.ToString("HH:mm:ss:ms"), clientAddress, data.Length);
         SendCompleted.BeginInvoke(clientAddress, data,
                                   ar =>
         {
             string address = ar.AsyncState as string;
             Console.WriteLine(address);
         }, successMsg);
     }
 }
 public void SendAsync(string message, object userState)
 {
     Task.Factory.StartNew(
         () =>
     {
         Thread.Sleep(1000);
         SendCompleted?.Invoke(
             this,
             new SendCompletedEventArgs(null, false, userState)
         {
             Response = "Test",
         });
     },
         CancellationToken.None,
         TaskCreationOptions.LongRunning,
         TaskScheduler.Default);
 }
Beispiel #9
0
        private void EndSend(IAsyncResult result)
        {
            SocketAsyncState state = (SocketAsyncState)result.AsyncState;

            //是否完成
            state.Completed = Handler.EndSend(result);
            //没有完成则断开Socket连接
            if (!state.Completed)
            {
                Disconnected(true);
            }

            //引发发送结束事件
            if (state.IsAsync)
            {
                SendCompleted?.Invoke(this, new SocketEventArgs(this, SocketAsyncOperation.Send)
                {
                    Data = state.Data
                });
            }
        }
Beispiel #10
0
        private void EndSend(IAsyncResult result)
        {
            SocketAsyncState state = (SocketAsyncState)result.AsyncState;

            //是否完成
            state.Completed = Handler.EndSend(result);
            //没有完成则断开Socket连接
            if (!state.Completed)
            {
                Disconnected(true);
            }
            //引发发送结束事件
            if (state.IsAsync)
            {
                if (DataSender.Status != SocketDataSender.SenderStatus.Preparing &&
                    DataSender.Status != SocketDataSender.SenderStatus.Sending)
                {
                    SendCompleted?.Invoke(this, new SocketEventArgs(this, SocketAsyncOperation.Send)
                    {
                        Data = state.Data
                    });
                }
                else
                {
                    DataSender.SendCompleted(this, new SocketEventArgs(this, SocketAsyncOperation.Send)
                    {
                        Data = state.Data
                    });
                    if (DataSender.Status == SocketDataSender.SenderStatus.Ready)
                    {
                        SendCompleted?.Invoke(this, new SocketEventArgs(this, SocketAsyncOperation.Send)
                        {
                            Data = DataSender.FullData
                        });
                    }
                }
            }
        }
        // 开始发件
        public Task Run(Stack <SendItem> sendItems)
        {
            // 创建线程
            Task task = Task.Run(async() =>
            {
                while (sendItems.Count > 0)
                {
                    // 开始并行发送
                    //确定smtp服务器地址 实例化一个Smtp客户端
                    SmtpClient smtpclient = new SmtpClient();
                    smtpclient.Host       = _sendBox.smtp;
                    //smtpClient.Port = "";//qq邮箱可以不用端口
                    //邮件发送方式  通过网络发送到smtp服务器
                    smtpclient.DeliveryMethod = SmtpDeliveryMethod.Network;
                    //如果服务器支持安全连接,则将安全连接设为true
                    smtpclient.EnableSsl = true;

                    // 获取发件箱
                    var sendItem    = sendItems.Pop();
                    var mailMessage = await GenerateMailMessage(sendItem);
                    try
                    {
                        //是否使用默认凭据,若为false,则使用自定义的证书,就是下面的networkCredential实例对象
                        smtpclient.UseDefaultCredentials = false;
                        //指定邮箱账号和密码,需要注意的是,这个密码是你在QQ邮箱设置里开启服务的时候给你的那个授权码
                        NetworkCredential networkCredential = new NetworkCredential(_sendBox.email, _sendBox.password);
                        smtpclient.Credentials = networkCredential;

                        //发送邮件
                        smtpclient.Send(mailMessage);

                        // 发送成功后,更新数据,更新到数据库
                        sendItem.senderEmail = _sendBox.email;
                        sendItem.senderName  = _sendBox.userName;
                        sendItem.isSent      = true;
                        sendItem.sendMessage = "邮件送达";
                        sendItem.sendDate    = DateTime.Now;
                        _liteDb.Upsert(sendItem);

                        // 更新到当前进度中
                        SendCompleted?.Invoke(new SendResult()
                        {
                            SendBox  = _sendBox,
                            SendItem = sendItem,
                            IsSent   = true,
                        });

                        // 保存成功的发件量
                        if (!_sendBox.IncreaseSentCount(_liteDb, _setting))
                        {
                            // 直接退出
                            return;
                        }
                    }
                    catch (Exception ex)
                    {
                        // 超过最大尝试次数就退出
                        if (sendItem.tryCount > 5)
                        {
                            // 此时也要更新进度
                            SendCompleted?.Invoke(new SendResult()
                            {
                                SendBox  = _sendBox,
                                SendItem = sendItem,
                                IsSent   = false
                            });
                        }
                        else if (_setting.isAutoResend) // 重新发送时,才重新推入栈中
                        {
                            // 更新状态
                            sendItem.tryCount++;
                            sendItem.isSent = false;

                            // 重新推入栈中
                            sendItems.Push(sendItem);
                        }

                        // 添加失败原因
                        if (ex.InnerException == null)
                        {
                            sendItem.sendMessage = ex.Message;
                        }
                        else
                        {
                            sendItem.sendMessage = ex.InnerException.Message;
                        }
                        _liteDb.Upsert(sendItem);

                        // 标记当前邮件失败次数
                        // 要等数据处理保存后,再更新
                        IncreaseFailure();
                    }
                    finally
                    {
                        // 每次发送完成,要等待一会儿再发送
                        double sleep = new Random().NextDouble() * 3 + 2;
                        if (_setting != null)
                        {
                            sleep = _setting.sendInterval_min + new Random().NextDouble() * (_setting.sendInterval_max - _setting.sendInterval_min);
                        }

                        // 线程暂停
                        Thread.Sleep((int)(sleep * 1000));
                    }
                }
            }, _cancellationTokenSource.Token);

            return(task);
        }
 private void Socket_SendCompleted(object sender, TcpCompletedEventArgs e)
 {
     SendCompleted?.Invoke(sender, e);
 }
Beispiel #13
0
 /// <summary>
 /// Invokes the SendCompleted event.
 /// </summary>
 /// <param name="sender_">The entity invoking the event</param>
 /// <param name="args_">The completed event args</param>
 protected virtual void OnSendCompleted(object sender_, AsyncCompletedEventArgs args_)
 {
     SendCompleted?.Invoke(sender_, args_);
 }
Beispiel #14
0
 /// <summary>
 /// 异步发信时发完以后的操作
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 void client_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
 {
     SendCompleted?.Invoke(sender, e);
 }
        private void TrySend(IAsyncResult ar)
        {
            var size = Socket.EndSend(ar);

            SendCompleted?.Invoke(this, new TcpCompletedEventArgs(size));
        }
Beispiel #16
0
 private void ClientSendCompleted(object sender, AsyncCompletedEventArgs e)
 {
     SendCompleted?.Invoke(sender, e);
     Dispose();
 }
Beispiel #17
0
 //向客户端发送数据完成
 private void client_SendCompleted(object sender, SocketEventArgs e)
 {
     SendCompleted?.Invoke(this, e);
 }
Beispiel #18
0
 /// <summary>
 /// Event invoker
 /// </summary>
 protected virtual void OnSendCompleted()
 {
     SendCompleted?.Invoke();
 }
Beispiel #19
0
 protected void OnSendCompleted(AsyncCompletedEventArgs e)
 {
     SendCompleted?.Invoke(this, e);
 }
 //向客户端发送数据完成
 private void client_SendCompleted(object sender, byte[] e)
 {
     SendCompleted?.Invoke(this, e);
 }