最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用系統(tǒng)方法發(fā)送異步郵件完整實(shí)例

 更新時(shí)間:2016年07月07日 11:31:14   作者:HTL  
這篇文章主要介紹了C#使用系統(tǒng)方法發(fā)送異步郵件實(shí)現(xiàn)方法,結(jié)合完整實(shí)例形式分析了C#異步調(diào)用與郵件發(fā)送的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C#使用系統(tǒng)方法發(fā)送異步郵件。分享給大家供大家參考,具體如下:

項(xiàng)目背景:

最近在對(duì)幾年前的一個(gè)項(xiàng)目進(jìn)行重構(gòu),發(fā)現(xiàn)發(fā)送郵件功能需要一定的時(shí)間來處理,而由于發(fā)送是同步的因此導(dǎo)致在發(fā)送郵件時(shí)無法執(zhí)行后續(xù)的操作

實(shí)際上發(fā)送郵件后只需要將發(fā)送結(jié)果寫入系統(tǒng)日志即可對(duì)其他業(yè)務(wù)沒有任何影響,因此決定將發(fā)送郵件操作更改為異步的

由于使用的是C#的郵件類庫,而C#本身已經(jīng)提供了異步發(fā)送的功能即只需要將Send方法更改為SendAsync即可,更改方法名并不難但發(fā)送后再寫入日志就有點(diǎn)難了

因?yàn)轫?xiàng)目中發(fā)送郵件是單獨(dú)的組件,所以我不可能在發(fā)送郵件類庫中直接添加寫入日志操作(不在同一個(gè)類庫,網(wǎng)絡(luò)和MSDN上的例子都是同一組件下)

但C#可以使用委托將方法作為參數(shù)來傳遞的,因此我就可以在發(fā)送郵件的方法中添加一個(gè)回調(diào)方法,在異步發(fā)送郵件后再執(zhí)行回調(diào)方法即可

完整代碼:

/******************************************************************
 * 創(chuàng)建人:HTL
 * 說明:C# 發(fā)送異步郵件Demo
 *******************************************************************/
using System;
using System.Net.Mail;
namespace SendAsyncEmailTest
{
  class Program
  {
    const string dateFormat = "yyyy-MM-dd :HH:mm:ss:ffffff";
    static void Main(string[] args)
    {
      Console.WriteLine("開始異步發(fā)送郵件,時(shí)間:" + DateTime.Now.ToString(dateFormat));
      new MailHelper().SendAsync("Send Async Email Test", "This is Send Async Email Test", "huangyuan413026@163.com", emailCompleted);
      Console.WriteLine("郵件正在異步發(fā)送,時(shí)間:" + DateTime.Now.ToString(dateFormat));
      Console.ReadKey();
      Console.WriteLine();
    }
    /// <summary>
    /// 郵件發(fā)送后的回調(diào)方法
    /// </summary>
    /// <param name="message"></param>
    static void emailCompleted(string message)
    {
      //延時(shí)1秒
      System.Threading.Thread.Sleep(1000);
      Console.WriteLine();
      Console.WriteLine("郵件發(fā)送結(jié)果:\r\n" + (message == "true" ? "郵件發(fā)送成功" : "郵件發(fā)送失敗") + ",時(shí)間:" + DateTime.Now.ToString(dateFormat));
      //寫入日志
    }
  }
  /// <summary>
  /// 發(fā)送郵件類
  /// </summary>
  public class MailHelper
  {
    public delegate int MethodDelegate(int x, int y);
    private readonly int smtpPort = 25;
    readonly string SmtpServer = "smtp.baidu.com";
    private readonly string UserName = "support@baidu.com";
    readonly string Pwd = "baidu.com";
    private readonly string AuthorName = "BaiDu";
    public string Subject { get; set; }
    public string Body { get; set; }
    public string Tos { get; set; }
    public bool EnableSsl { get; set; }
    MailMessage GetClient
    {
      get
      {
        if (string.IsNullOrEmpty(Tos)) return null;
        MailMessage mailMessage = new MailMessage();
        //多個(gè)接收者
        foreach (string _str in Tos.Split(','))
        {
          mailMessage.To.Add(_str);
        }
        mailMessage.From = new System.Net.Mail.MailAddress(UserName, AuthorName);
        mailMessage.Subject = Subject;
        mailMessage.Body = Body;
        mailMessage.IsBodyHtml = true;
        mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
        mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;
        mailMessage.Priority = System.Net.Mail.MailPriority.High;
        return mailMessage;
      }
    }
    SmtpClient GetSmtpClient
    {
      get
      {
        return new SmtpClient
        {
          UseDefaultCredentials = false,
          Credentials = new System.Net.NetworkCredential(UserName, Pwd),
          DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
          Host = SmtpServer,
          Port = smtpPort,
          EnableSsl = EnableSsl,
        };
      }
    }
    //回調(diào)方法
    Action<string> actionSendCompletedCallback = null;
    ///// <summary>
    ///// 使用異步發(fā)送郵件
    ///// </summary>
    ///// <param name="subject">主題</param>
    ///// <param name="body">內(nèi)容</param>
    ///// <param name="to">接收者,以,分隔多個(gè)接收者</param>
    //// <param name="_actinCompletedCallback">郵件發(fā)送后的回調(diào)方法</param>
    ///// <returns></returns>
    public void SendAsync(string subject, string body, string to, Action<string> _actinCompletedCallback)
    {
      if (string.IsNullOrEmpty(to)) return;
      Tos = to;
      SmtpClient smtpClient = GetSmtpClient;
      MailMessage mailMessage = GetClient;
      if (smtpClient == null || mailMessage == null) return;
      Subject = subject;
      Body = body;
      EnableSsl = false;
      //發(fā)送郵件回調(diào)方法
      actionSendCompletedCallback = _actinCompletedCallback;
      smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
      try
      {
        smtpClient.SendAsync(mailMessage, "true");//異步發(fā)送郵件,如果回調(diào)方法中參數(shù)不為"true"則表示發(fā)送失敗
      }
      catch (Exception e)
      {
        throw new Exception(e.Message);
      }
      finally
      {
        smtpClient = null;
        mailMessage = null;
      }
    }
    /// <summary>
    /// 異步操作完成后執(zhí)行回調(diào)方法
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
      //同一組件下不需要回調(diào)方法,直接在此寫入日志即可
      //寫入日志
      //return;
      if (actionSendCompletedCallback == null) return;
      string message = string.Empty;
      if (e.Cancelled)
      {
        message = "異步操作取消";
      }
      else if (e.Error != null)
      {
        message = (string.Format("UserState:{0},Message:{1}", (string)e.UserState, e.Error.ToString()));
      }
      else
        message = (string)e.UserState;
      //執(zhí)行回調(diào)方法
      actionSendCompletedCallback(message);
    }
  }
}

運(yùn)行效果圖如下:

更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#窗體操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》、《C#操作Excel技巧總結(jié)》、《C#中XML文件操作技巧匯總》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程

希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C#編程之依賴倒置原則DIP

    C#編程之依賴倒置原則DIP

    這篇文章介紹了C#編程之依賴倒置原則DIP,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • winform分頁控件 附源碼下載

    winform分頁控件 附源碼下載

    這篇文章主要介紹了winform分頁控件,文中附源碼下載地址,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • C#之繼承實(shí)現(xiàn)

    C#之繼承實(shí)現(xiàn)

    本文詳細(xì)講解了C#之繼承的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#中ref和out的區(qū)別淺析

    C#中ref和out的區(qū)別淺析

    這篇文章主要介紹了C#中ref和out的區(qū)別淺析,當(dāng)一個(gè)方法需要返回多個(gè)值的時(shí)候,就需要用到ref和out,那么這兩個(gè)方法區(qū)別在哪兒呢,需要的朋友可以參考下
    2015-01-01
  • 微信開發(fā)--企業(yè)轉(zhuǎn)賬到用戶

    微信開發(fā)--企業(yè)轉(zhuǎn)賬到用戶

    本文主要介紹了微信開發(fā)--企業(yè)轉(zhuǎn)賬到用戶的實(shí)現(xiàn)方法與步驟。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • C#讀取txt文件數(shù)據(jù)的方法實(shí)例

    C#讀取txt文件數(shù)據(jù)的方法實(shí)例

    讀取txt文本數(shù)據(jù)的內(nèi)容,是我們開發(fā)中經(jīng)常會(huì)遇到的一個(gè)功能,這篇文章主要給大家介紹了關(guān)于C#讀取txt文件數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • C# 添加對(duì)System.Configuration.dll文件的引用操作

    C# 添加對(duì)System.Configuration.dll文件的引用操作

    這篇文章主要介紹了C# 添加對(duì)System.Configuration.dll文件的引用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C# WPF中實(shí)現(xiàn)圖表生成的五種方式

    C# WPF中實(shí)現(xiàn)圖表生成的五種方式

    在現(xiàn)代應(yīng)用程序中,數(shù)據(jù)可視化是一個(gè)重要的功能,它可以幫助用戶更直觀地理解數(shù)據(jù),在C# WPF中,有多種方式可以生成圖表,以下是五種常見的方法,每種方法都有其獨(dú)特的優(yōu)勢(shì)和局限,感興趣的小伙伴跟著小編一起來看看吧
    2024-09-09
  • c#文件的I/O基本操作

    c#文件的I/O基本操作

    System.IO命名空間包含允許在數(shù)據(jù)流和文件上進(jìn)行同步,異步及寫入的類型,下面是關(guān)于c#文件的I/O基本操作講解,需要的朋友可以參考下
    2014-03-03
  • C#封裝將函數(shù)封裝為接口dll的簡(jiǎn)單步驟指南

    C#封裝將函數(shù)封裝為接口dll的簡(jiǎn)單步驟指南

    在C#中,封裝函數(shù)為接口并打包成DLL是實(shí)現(xiàn)代碼重用和模塊化的常見方法,此過程包括創(chuàng)建類庫項(xiàng)目、定義接口、實(shí)現(xiàn)接口、編譯項(xiàng)目生成DLL文件,這種方法適用于需要在多個(gè)項(xiàng)目間共享功能時(shí)使用,需要的朋友可以參考下
    2024-11-11

最新評(píng)論

金堂县| 正镶白旗| 临安市| 德州市| 琼中| 南皮县| 凤城市| 南宫市| 青龙| 九寨沟县| 米脂县| 大冶市| 肇东市| 香港 | 泰来县| 收藏| 开江县| 临颍县| 襄樊市| 阳西县| 本溪市| 桑植县| 伊宁县| 奉贤区| 彭阳县| 卢湾区| 陕西省| 颍上县| 九龙坡区| 昌黎县| 凤冈县| 抚松县| 镇平县| 曲水县| 克什克腾旗| 增城市| 龙泉市| 青河县| 衢州市| 仪陇县| 冀州市|