C#.net后台BLL的一个线程需要等待前台页面用户输入并返回结果才能继续执行,有什么好方法吗

时间:2023-01-23 18:31:55
小弟刚刚接触C#和.net,现在开发过程中遇到的问题是BLL中的某个线程需要等待用户在前台页面输入,然后才根据用户输入的内容继续执行该线程。目前我的做法是在BLL中声明一个全局变量,然后点击了页面的提交按钮后, 在xxx.aspx.cs中处理,并将结果写到全局变量,然后BLL的线程一直查询该变量,直到有结果才继续执行下去,但是这样做挨批评了,求大神给点主意 C#.net后台BLL的一个线程需要等待前台页面用户输入并返回结果才能继续执行,有什么好方法吗

12 个解决方案

#1


提交按钮 之前   校验是否输入,输入了就开启线程执行;没输入 提示输入信息。

#2


这样做肯定挨批啦。有数据库没,或者文件也行啊。将数据写入数据库或者文件,然后从那个里面读。

#3


.net框架,为什么要开线程,什么功能?

#4


.net中慎用static
因为声明为static之后,所有用户都用的同一个对象了

#5


用ManualResetEvent或AutoResetEvent,在线程里需要等待输入的地方用WaitOne()阻塞线程,用户输入完成就Set()

#6


引用 3 楼 Z65443344 的回复:
.net框架,为什么要开线程,什么功能?
类似于工作流引擎的东西,多个事件而且需要自动并发执行,所以我开了线程,如果不能static,那有什么好的方法没?

#7


page_load完成后让线程睡眠,用户点击后thread.start()

#8


引用 1 楼 duanzi_peng 的回复:
提交按钮 之前   校验是否输入,输入了就开启线程执行;没输入 提示输入信息。
不是这样的,原本用户输入是一个流程的一个步骤,等用户输入了,我才能继续完成这个步骤,然后进入下一步骤,一个步骤为一个线程,现在线程已经开始,只是需要阻塞等结果,但是在BLL我获取不了页面上用户输入的东西,所以就在页面对应的xxxx.aspx.cs获取,处理了在返回个结果给BLL的某个全局static变量,然后线程一直在查询这个变量,找到有结果才跳出循环进入下一步,现在问题是要换种方法,求教

#9


引用 7 楼 lwq222121 的回复:
page_load完成后让线程睡眠,用户点击后thread.start()
问题是线程不是在xxx.aspx.cs文件启动的,是在BLL的某个类里面启动的,而且要求是启动之后执行一些语句然后阻塞,等待用户输入再执行剩下语句,有办法么

#10


引用 5 楼 sunny906 的回复:
用ManualResetEvent或AutoResetEvent,在线程里需要等待输入的地方用WaitOne()阻塞线程,用户输入完成就Set()
谢谢,还是有疑问,项目是层次结构的,用户输入在USL层,BLL层的线程调用WaitOne()后,USL层有了结果怎么使用set()让线程继续执行?因为是多线程,每个线程都执行一个事件,有可能在同一时间存在多个事件都是需要阻塞等待用户输入的,怎么找出正确的线程并启动呢?

#11


有多个线程的话,就用数组

            ManualResetEvent[] man = new ManualResetEvent[n];
            //你的代码段...
            //完成操作的线程就调用Set()

            WaitHandle.WaitAll(man); //等待输入的线程调用WaitAll

#12


为什么不将程序分成合理的小段函数,使用事件触发。

#1


提交按钮 之前   校验是否输入,输入了就开启线程执行;没输入 提示输入信息。

#2


这样做肯定挨批啦。有数据库没,或者文件也行啊。将数据写入数据库或者文件,然后从那个里面读。

#3


.net框架,为什么要开线程,什么功能?

#4


.net中慎用static
因为声明为static之后,所有用户都用的同一个对象了

#5


用ManualResetEvent或AutoResetEvent,在线程里需要等待输入的地方用WaitOne()阻塞线程,用户输入完成就Set()

#6


引用 3 楼 Z65443344 的回复:
.net框架,为什么要开线程,什么功能?
类似于工作流引擎的东西,多个事件而且需要自动并发执行,所以我开了线程,如果不能static,那有什么好的方法没?

#7


page_load完成后让线程睡眠,用户点击后thread.start()

#8


引用 1 楼 duanzi_peng 的回复:
提交按钮 之前   校验是否输入,输入了就开启线程执行;没输入 提示输入信息。
不是这样的,原本用户输入是一个流程的一个步骤,等用户输入了,我才能继续完成这个步骤,然后进入下一步骤,一个步骤为一个线程,现在线程已经开始,只是需要阻塞等结果,但是在BLL我获取不了页面上用户输入的东西,所以就在页面对应的xxxx.aspx.cs获取,处理了在返回个结果给BLL的某个全局static变量,然后线程一直在查询这个变量,找到有结果才跳出循环进入下一步,现在问题是要换种方法,求教

#9


引用 7 楼 lwq222121 的回复:
page_load完成后让线程睡眠,用户点击后thread.start()
问题是线程不是在xxx.aspx.cs文件启动的,是在BLL的某个类里面启动的,而且要求是启动之后执行一些语句然后阻塞,等待用户输入再执行剩下语句,有办法么

#10


引用 5 楼 sunny906 的回复:
用ManualResetEvent或AutoResetEvent,在线程里需要等待输入的地方用WaitOne()阻塞线程,用户输入完成就Set()
谢谢,还是有疑问,项目是层次结构的,用户输入在USL层,BLL层的线程调用WaitOne()后,USL层有了结果怎么使用set()让线程继续执行?因为是多线程,每个线程都执行一个事件,有可能在同一时间存在多个事件都是需要阻塞等待用户输入的,怎么找出正确的线程并启动呢?

#11


有多个线程的话,就用数组

            ManualResetEvent[] man = new ManualResetEvent[n];
            //你的代码段...
            //完成操作的线程就调用Set()

            WaitHandle.WaitAll(man); //等待输入的线程调用WaitAll

#12


为什么不将程序分成合理的小段函数,使用事件触发。