多线程问题

lb520zw 2014-08-18 12:44:34
之前一直做asp.net项目,印象中基本没怎么用过的多线程,
请问大家在实际项目中什么样的项目中会用到多线程比较多,比如web项目还是winform,还是wpf中?

请具体结合项目中的实际例子,给写答案,谢谢.不要太理论化,我想要看看实际哪里用到了及如何用?
...全文
289 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你可以思考一下流程就能发现,给大领导决策用的大型系统,数据类型多变(而且经常在应激政治任务下多变),但是不管怎样高级,展示效率仍然是第一位的。 所以虽然只有两个简单的数据实例保存决策信息(实际上另外有一个数据交换中心系统支撑),但不能顺序查询数据,必须并行查询。
  • 打赏
  • 举报
回复
这里由于它主要是一个决策支持系统,并不涉及任何业务计算(没有数据不一致性问题),因此这个查询默认缓存5秒钟。 这里从系统线程池中注册两个线程执行方法,分别使用两个不一样的“数据库连接字符串”,执行同一个 sql 查询语句。 然后,首先等待第二个实例查询结束 eh2.WaitOne() ,如果它没有查询出来数据才会等待第一个实例查询结束 eh1.WaitOne(),否则不会等待第一个实例查询结束。
  • 打赏
  • 举报
回复
asp.net2.0以后,本来就是使用多线程来响应请求的。也就是说你的网页代码之间本来就是多线程执行的。所以asp.net程序即使很少用它,但是不代表着它不重要。它时时刻刻都在帮asp.net程序(web服务器并发响应)提高效率。 给你举一个编程例子。我们有一个程序,需要同时查询两个数据库实例。这两个数据库实例中有着完全相同的数据库表结构,但是其中一个实例是允许在局域网(实际上是大型企业集团光纤城域网)内远程访问的,另一个是不允许远程访问而只能本地访问的。 这样做是因为有许多数据可能从集团里的其它前置机(比如给部里报数据的前置机,或者营业厅报表系统)或者系统中推数据,因此可能随时需要“开放”远程访问。同时我们又希望随时限制一些数据被其它系统访问到,需要禁止远程访问,防止被其它几十个公司把数据“偷”走或者破坏掉。而且数据表的这类配置需要灵活调整。 于是,对于任何查询操作,我们其实需要并行地查询两个数据库实例,如果第二个实例上有数据,那么就做为查询结果返回(丢弃掉第一个实例的查询结果)。否则就以第一个实例查询到的结果做为返回值。 这样一个查询服务是这样的 Query.ashx

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Dynamic;
    using System.Threading;
    using System.Web;

    public class QueryMSSQL : IHttpHandler
    {
        // 查询数据库,将查询结果转换为 json 数据 table 格式返回
        public void ProcessRequest(HttpContext context)
        {
            try
            {
                var sql = context.Server.UrlDecode(context.Request.QueryString["sql"]);
                var jsonResult = Query(sql);
                context.Response.ContentType = "text/plain";
                context.Response.Write(jsonResult);
            }
            catch
            {
                context.Response.StatusCode = 500;
            }
        }

        private static string Query(string sql)
        {
            var key = string.Format("查询_{0}_的结果", sql);
            var cache = HttpRuntime.Cache;
            var jsonResult = (string)cache[key];
            if (jsonResult == null)
            {
                var eh1 = new ManualResetEvent(false);
                var eh2 = new ManualResetEvent(false);
                List<ExpandoObject> result;
                List<ExpandoObject> r1 = null;
                List<ExpandoObject> r2 = null;
                ThreadPool.QueueUserWorkItem(h =>
                {
                    string ConnectionString = "........第二个实例.........";
                    r2 = GetResults(sql, ConnectionString);
                    eh2.Set();
                });
                ThreadPool.QueueUserWorkItem(h =>
                {
                    string ConnectionString = "........第一个实例.........";
                    r1 = GetResults(sql, ConnectionString);
                    eh1.Set();
                });
                eh2.WaitOne();
                if (r2.Count > 0)
                {
                    result = r2;
                }
                else
                {
                    eh1.WaitOne();
                    result = r1;
                }
                jsonResult = JsonConvert.SerializeObject(result);   //将记录集合转换为json字符串
                cache.Insert(key, jsonResult, null, DateTime.Now.AddSeconds(5), System.Web.Caching.Cache.NoSlidingExpiration);     //缓存5秒钟
            }
            return jsonResult;
        }

        private static List<ExpandoObject> GetResults(string sql, string ConnectionString)
        {
            var result = new List<ExpandoObject>();
#if !DEBUG
            try
            {
#endif
            using (var conn = new SqlConnection(ConnectionString))
            {
                conn.Open();
                var comm = conn.CreateCommand();
                comm.CommandText = sql;
                comm.CommandType = System.Data.CommandType.Text;
                var reader = comm.ExecuteReader();
                while (reader.Read())
                {
                    var record = new ExpandoObject();
                    result.Add(record);
                    var dic = (IDictionary<string, object>)record;
                    for (var i = 0; i < reader.FieldCount; i++)
                        dic.Add(reader.GetName(i), reader[i]);
                }
            }
#if !DEBUG
            }
            catch { }
#endif
            return result;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
nongfuxu 2014-08-19
  • 打赏
  • 举报
回复
引用
v那位大神可以推荐几本关于线程的好书吗?
最好的书是网上查资料。比方本坛子里有好多...
卿文天 2014-08-19
  • 打赏
  • 举报
回复
给举例一个自己编写服务器方面的实例: 现在有一个需求,需要服务器端接收和处理N个终端设备发送来的信息(通信方式可以是TCP或者UDP都行)。 这里就可以设计在服务端开启N个线程,每个线程处理一个终端发来的信息,处理方式可以是业务逻辑,最后入数据库或者转发送等。
kissqiong 2014-08-19
  • 打赏
  • 举报
回复
楼上的,你那是并发好吧!
於黾 2014-08-18
  • 打赏
  • 举报
回复
具体例子: 串口读取设备信息,入数据库 从多PC采集状态,入库 将数据发送到多PC的客户端 webservice,响应客户端请求,访问数据库
於黾 2014-08-18
  • 打赏
  • 举报
回复
web项目天生就是多线程的,不同用户同时访问网站,每个用户都互不干扰 winform项目中,通信相关的,一般都使用多线程. 比如和数据库通信,和多PC通信,和多串口通信,等等
lb520zw 2014-08-18
  • 打赏
  • 举报
回复
那请问wcf服务的异步调用,算是使用的多线程的例子吗
AS1317253535 2014-08-18
  • 打赏
  • 举报
回复
v那位大神可以推荐几本关于线程的好书吗?
  • 打赏
  • 举报
回复
还有做一些不影响主业务的功能时,比如记日志,这个直接用线程池也是可以的
  • 打赏
  • 举报
回复
WEB也是要用到多线程的,举个最简单的例子就是一次请求的结果,分别要从N个地方获取数据,然后在业务层进行合并过滤后返回
sunny906 2014-08-18
  • 打赏
  • 举报
回复
主要解决多任务的同步和异步操作
sunny906 2014-08-18
  • 打赏
  • 举报
回复
winform和wpf用多线程的情况多
bdmh 2014-08-18
  • 打赏
  • 举报
回复
个人感觉winform比较多用,常用于处理一些繁琐耗时的代码,防止界面假死或提高用户体验

111,113

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧