winform使用多线程时,界面假死

DisorNDis 2017-07-13 12:10:54
主程序::
public bool ifFilter = true;
private Time _Timer;
private int _Interval = 86400000;
MySqlHelper db = new MySqlHelper();
FileStream fs;
public Filter()
{
InitializeComponent();
fs = new FileStream(@"log.txt", FileMode.OpenOrCreate);
}

private void button1_Click(object sender, EventArgs e)
{
ifFilter = false;
using (var db = new MySqlHelper())
{
BLL.Filter.FilterALL(db, fs);
}
ifFilter = true;
}

BLL下FilterALL方法:
static Dictionary<string, string> store = new Dictionary<string, string>();
internal static void FilterALL(MySqlHelper db, FileStream fs)
{
if (db == null) { }
db.ClearParameter();
string sqlStr = string.Format(@"SELECT id FROM nms_key_info;");
DataTable vs = db.GetDataSet(sqlStr).Tables[0];
int number= vs.Rows.Count;
ThreadPool.SetMaxThreads(1000,1000);

for (var i = 0; i < number; i++)
{

string idd = vs.Rows[i]["id"].ToString();
db.ClearParameter();
db.SetParameter("ids", MySql.Data.MySqlClient.MySqlDbType.VarChar, 32, vs.Rows[i]["id"].ToString());
string sqlstr = string.Format(@"SELECT allkeyword,refword,title,ly FROM nms_key_info where id=@ids");
string sqlstr2 = string.Format(@"SELECT content FROM nms_key_info_text where id=@ids");
DataTable str1 = db.GetDataSet(sqlstr).Tables[0];
string str2 = db.GetDataSet(sqlstr2).Tables[0].Rows[0]["content"].ToString();
pack mypack = new pack();
mypack.id = idd;
mypack.ly = str1.Rows[0]["ly"].ToString();
mypack.keywords = str1.Rows[0]["allkeyword"].ToString();
mypack.refwords = str1.Rows[0]["refword"].ToString();
mypack.title = str1.Rows[0]["title"].ToString();
mypack.cotent = str2;
ThreadPool.QueueUserWorkItem(new WaitCallback(run),mypack);
}
GetRecord(fs);
}
internal static void GetRecord(FileStream fs)
{
foreach(KeyValuePair<string,string> single in store)
{
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(single.Key + " " + single.Value+" "+DateTime.Now);
sw.Close();
}
}
internal static void run(object mypackage)
{
pack newpack = mypackage as pack;
bool ifcontent = true;
bool ifref = true;
for (int j = 0; j < newpack.keywords.ToString().Split('+').Length; j++)
{
if (newpack.title.IndexOf(newpack.keywords.ToString().Split('+')[j]) > -1 || newpack.cotent.IndexOf(newpack.keywords.ToString().Split('+')[j]) > -1)
{
ifcontent = true;
}
else
{
ifcontent = false;
}
}
if (ifcontent == false)
{
//StreamWriter sw = new StreamWriter(fs);
//sw.WriteLine(idd + " " + str1.Rows[0]["ly"]);
//sw.Close();
store.Add(newpack.id, newpack.ly);

System.Threading.Thread.CurrentThread.Abort();
}
else
{
for (int k = 0; k < newpack.refwords.ToString().Split('|').Length; k++)
{
if (newpack.title.IndexOf(newpack.refwords.ToString().Split('|')[k]) > -1 || newpack.cotent.IndexOf(newpack.refwords.ToString().Split('|')[k]) > -1)
{
ifref = true;
}
else
{
ifref = false;
}
}
if (ifref == false)
{
store.Add(newpack.id, newpack.ly);
System.Threading.Thread.CurrentThread.Abort();
}
}
}

...全文
234 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2017-07-14
  • 打赏
  • 举报
回复
耗时的操作都放到线程池或者工作线程中去, 否则主线程被阻塞,表现出来就是假死
DisorNDis 2017-07-13
  • 打赏
  • 举报
回复
引用 2 楼 StratosBlue 的回复:
感觉你还是有一些逻辑是在主线程执行的,把button1_Click里面改写为这样看看

            new Task(() =>
            {
                ifFilter = false;
                using (var db = new MySqlHelper())
                {
                    BLL.Filter.FilterALL(db, fs);
                }
                ifFilter = true;
            }).Start();
嗯,确实是这样,谢了
Anonymous477 2017-07-13
  • 打赏
  • 举报
回复
感觉你还是有一些逻辑是在主线程执行的,把button1_Click里面改写为这样看看

            new Task(() =>
            {
                ifFilter = false;
                using (var db = new MySqlHelper())
                {
                    BLL.Filter.FilterALL(db, fs);
                }
                ifFilter = true;
            }).Start();
DisorNDis 2017-07-13
  • 打赏
  • 举报
回复
这是为什么呢,在线等,求解

110,533

社区成员

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

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

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