具体需求是这样的,从自己的数据库里拿出属于该用户的顾客名单,然后再从qq邮箱里拿出该用户45天内的发件记录进行对比,以15天为一个小周期查询邮件发件箱是否有顾客名单(其中顾客名单包含了最后一次发信息的日期记录)在里面。 
       我的思路是这样的:先拿出45天的邮件,然后提取每个收件人最新的一封邮件,然后用foreach对两个list进行匹配,看顾客名单记录和邮件记录相差多远,再根据顾客时间记录相差多少个15天进行业务处理。
       那么我用的是MailKit这个控件进行查询45天的邮件总量大概最少一千张左右(仅包含从qq邮箱服务器到本机获取邮箱列表的时间)。原来大概5分钟才能处理完毕,然后开了几个task缩成2分钟左右。我知道用foreach去对比两个list是一件很蠢的事情,还有用task也不是最优解,那么诚心请问有没有更好的办法能缩短这个时间呢?,最后,作为新手, 各位老师在日常工作中是如何尽量把自己写bug的概率降低到最低的呢?

解决方案 »

  1.   

    我觉得先作好邮件的基础数据,可以作一个类public class smail
    {
        //发件人
        public string FromMail;
        //收件人
        public string ToMail;
        //日期
        public datetime MailDate;
        //主题
        public string title;
        //内容
        public string body;
    }
    而取邮件后生成List<smail>,并按你要对比的信息排序,比如你按发件人查找,写一Find方法(这种情况二分法最好),再按你的客户名单对邮件List<smail>进行遍历(使用Find方法),得出信息结果,并记入客户名单
      

  2.   

    第一步我的确是和你说的办法一样,不过我当时检查的时候,吃的时间比较多的主要是从根据邮件服务器uid获取邮件真正内容上。但是用二分法的确是一个好方法。这个可以试试
      

  3.   

    学到了  这个我以前的实现思路和楼主一样 数据太慢了,,,,要不要试试linq匹配一样的包含数据
      

  4.   

     
             这种想法我也有,但是想请教一下如何保证数据库里的信息能和邮箱里的信息同步?因为用户是会随时随地打开页面的。
             另外按照版主大人说的持久到数据库里,那么总是会有第一次打开qq邮箱获取邮件这个操作,那么最关键的从uid变成邮箱实际信息这个转换耗时过长的操作有没有什么好的方法?
      

  5.   

    请问一下是并行linq吗?
      

  6.   

    job定时同步,不需要用户第一次打开