none
多线程异步 RRS feed

  • 问题

  •  想做一个多线程异步的程序,要求如下根据用户输入的整数来生成多少个线程(最多不大于10),

    多个线程跑同一个SQL脚本, 同不过是参数不同罢了, 当多个线程跑完, 再将多个线程查询出来的结果

    汇总到一个List中, 再返回到页面绑定到数据控件,  但整个过程必须是异步, 不能因为查询时间太久而

    造成假死的现像. 不知大家有没有相应的代码业推荐.


    学习者
    2010年1月25日 9:02

答案

  • 你好 你可以将查询的语句写在一个方法中  通过ThreadPool.QueueUserWorkItem来调用  参数通过objectState 传入
    这个方法调用的次数由用户的设置

    对于不大于10的限制可以通过同步基元中的Semaphore类来控制信号量的大小 你这里可以设置为10就可以了
    下面是我曾经写的一段代码,一个后台多线程的任务引擎 要做的事情和你差不多
    private static Semaphore poolSync;

    if (TaskThreadPool.poolSync == null)
                {
                    TaskThreadPool.poolSync = new Semaphore(0, this.Config.ConcurrentThreads);//this.Config.ConcurrentThreads 这里相当于你要限制的并发数

                }

                for (int i = 0; i < this.WaitingQueue.Count; i++)
                {
                    ThreadPool.QueueUserWorkItem(this.FetchTask);
                }
    TaskThreadPool.poolSync.Release(this.Config.ConcurrentThreads);//这里释放你要限制的并发数的数量


     /// 获取任务然后执行
            /// </summary>
            private void FetchTask(object objectState)//你的参数可以通过 objectState参数来传递
            {
                if (this.Status == TaskThreadPoolStatus.Clearing)
                    return;
                TaskThreadPool.poolSync.WaitOne();
                TaskExecutionContext context = new TaskExecutionContext();
                context.TaskStatus = TaskExecutionStatus.ExecutionWaiting;

                TaskInfo task;

                if (this.WaitingQueue.TryFetchTask(out task))
                {
                    this.ExecuteTask(context, task);
                }
                TaskThreadPool.poolSync.Release();
            }


    将所有的执行任务保存在一个队列中,在每个线程执行的方法后将结果保存在一个私有字段  等队列中的所有执行完毕后再汇总


    Memory all alone in the moonlight~My Blog in .NET~~~
    2010年1月26日 2:00
    版主
  • 你好!
         补充一下,可以把这个SQL脚本定义成存储过程,这样可以提供运行的速度!
    周雪峰
    2010年1月26日 5:47
    版主

全部回复

  •  想做一个多线程异步的程序,要求如下根据用户输入的整数来生成多少个线程(最多不大于10),

    多个线程跑同一个SQL脚本, 同不过是参数不同罢了, 当多个线程跑完, 再将多个线程查询出来的结果

    汇总到一个List中, 再返回到页面绑定到数据控件,  但整个过程必须是异步, 不能因为查询时间太久而

    造成假死的现像. 不知大家有没有相应的代码业推荐.


    学习者
    2010年1月25日 9:03
  • 你好 你可以将查询的语句写在一个方法中  通过ThreadPool.QueueUserWorkItem来调用  参数通过objectState 传入
    这个方法调用的次数由用户的设置

    对于不大于10的限制可以通过同步基元中的Semaphore类来控制信号量的大小 你这里可以设置为10就可以了
    下面是我曾经写的一段代码,一个后台多线程的任务引擎 要做的事情和你差不多
    private static Semaphore poolSync;

    if (TaskThreadPool.poolSync == null)
                {
                    TaskThreadPool.poolSync = new Semaphore(0, this.Config.ConcurrentThreads);//this.Config.ConcurrentThreads 这里相当于你要限制的并发数

                }

                for (int i = 0; i < this.WaitingQueue.Count; i++)
                {
                    ThreadPool.QueueUserWorkItem(this.FetchTask);
                }
    TaskThreadPool.poolSync.Release(this.Config.ConcurrentThreads);//这里释放你要限制的并发数的数量


     /// 获取任务然后执行
            /// </summary>
            private void FetchTask(object objectState)//你的参数可以通过 objectState参数来传递
            {
                if (this.Status == TaskThreadPoolStatus.Clearing)
                    return;
                TaskThreadPool.poolSync.WaitOne();
                TaskExecutionContext context = new TaskExecutionContext();
                context.TaskStatus = TaskExecutionStatus.ExecutionWaiting;

                TaskInfo task;

                if (this.WaitingQueue.TryFetchTask(out task))
                {
                    this.ExecuteTask(context, task);
                }
                TaskThreadPool.poolSync.Release();
            }


    将所有的执行任务保存在一个队列中,在每个线程执行的方法后将结果保存在一个私有字段  等队列中的所有执行完毕后再汇总


    Memory all alone in the moonlight~My Blog in .NET~~~
    2010年1月26日 2:00
    版主
  • 你好 我已经在你的另一个帖子中回复你 http://social.microsoft.com/Forums/zh-CN/2212/thread/e076a246-7996-4fda-b166-bad473bb53c2
    Memory all alone in the moonlight~My Blog in .NET~~~
    2010年1月26日 2:14
    版主
  • 你好!
         补充一下,可以把这个SQL脚本定义成存储过程,这样可以提供运行的速度!
    周雪峰
    2010年1月26日 5:47
    版主