解决方案 »
- 如何将SqlServer数据库中的数据导入到Excel中
- 面向对象方面问题
- 请教一条数据库语句~~
- 如何控制外部程序运行并交互
- 反序列化出错!在线等,高分
- 分不是问题,菜鸟上路,C#中怎么没有普通的Grid的控件啊?
- 卖烧饼了........来者有份,送可乐,还打八折!!!!!!!!!!!
- 求winform透明背景的自定义comboBox控件的源码或者方案
- 我在数据库中进行数据库查询"select * from f where comapny like '%"+this.company+"'可是每次this.company的值都有是'1'这样的话数据库
- 请问turbo vision--是什么软件?就是turboC吗?
- appface使用问题
- 添加属性
hsghxm 这位仁兄,能不能给点详细的指导或者例子呢??我对线程这一块不是很熟悉
public partial class API : Form
{
Thread List1;
Thread List2;
Thread List3;
Thread List4;
//窗体加载
public TaoBaoAPI()
{
InitializeComponent();
List1= new Thread(new ParameterizedThreadStart(staticClass.methed1));
List2= new Thread(new ParameterizedThreadStart(staticClass.methed2));
List3= new Thread(new ParameterizedThreadStart(staticClass.methed3));
List4= new Thread(new ParameterizedThreadStart(staticClass.methed4));
}
/// <summary>
/// linklabel 【运行】的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void linklabelRun_Click(object sender,EventArgs e)
{
string name = ((LinkLabel)sender).Name;
switch (name)
{
case "lnklbl1":
List1.IsBackground = true;
List1.Start(this);
break;
case "lnklbl2":
List2.IsBackground = true;
List2.Start(this);
break; case "lnklbl3":
List3.IsBackground = true;
List3.Start(this);
break; case "lnklbl4":
List4.IsBackground = true;
List4.Start(this);
break;
}
} /// <summary>
/// linklabel 【暂停】的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void linklabelStop_Click(object sender, EventArgs e)
{
string strLblName = ((LinkLabel)sender).Name.ToString();
switch (strLblName)
{
case "lnklbl1_1":
if (List1.ThreadState.ToString() != "Stopped")
{
List1.Suspend();//挂起线程
if (!closing(strLblName))//判断是否继续,如果是false,继续执行线程
List1.Resume();
else
List1.Suspend();
}
break;
case "lnklbl1_2":
if (List2.ThreadState.ToString() != "Stopped")
{
List2.Suspend();//挂起线程
if (!closing(strLblName))//判断是否继续,如果是false,继续执行线程
List2.Resume();
else
List2.Suspend();
}
break;
case "lnklbl1_3":
if (List3.ThreadState.ToString() != "Stopped")
{
List3.Suspend();//挂起线程
if (!closing(strLblName))//判断是否继续,如果是false,继续执行线程
List3.Resume();
else
List3.Suspend();
}
break;
case "lnklbl1_4":
if (List4.ThreadState.ToString() != "Stopped")
{
List4.Suspend();//挂起线程
if (!closing(strLblName))//判断是否继续,如果是false,继续执行线程
List4.Resume();
else
List4.Suspend();
}
break;
}
} private bool closing(string threadName)
{
DialogResult result = MessageBox.Show("你确认要【暂停】该程序吗?", "暂停提示", MessageBoxButtons.YesNo, MessageBoxIcon.Hand);
if (result == DialogResult.Yes && threadName == "lnklbl1_1")
{
lblWait1.Text = "程序已暂停。";
return true;
}
if (result == DialogResult.Yes && threadName == "lnklbl1_2")
{
lblWait2.Text = "程序已暂停。";
return true;
}
if (result == DialogResult.Yes && threadName == "lnklbl1_3")
{
lblWait3.Text = "程序已暂停。";
return true;
}
if (result == DialogResult.Yes && threadName == "lnklbl1_4")
{
lblWait4.Text = "程序已暂停。";
return true;
}
}
大体的逻辑就是这样的,大家给我指导一下吧啊,尽量能帮我用代码的形式解释,谢谢了
以上代码 在运行的时候都互不影响,但是当我挂起其中一个线程(比如挂起List1线程)的时候,其它的线程也被挂起了,但是当继续运行被挂起的线程(List1)的时候,其它的线程也都又开始运行了。这个就是郁闷的地方。
看看是否是这个判断问题
staticClass.methed2
staticClass.methed3
staticClass.methed4
这些方法会不会相互干扰?比如操作同一个变量
public static void methed1(object para)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("运行了methed1方法 " + i);
API f = para as API;
f.MsgAppend("运行了" + i + "次", Color.Khaki);
}
} public static void methed2(object para)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("运行了methed2方法 " + i);
API f = para as API;
f.MsgAppend("运行了" + i + "次", Color.Khaki);
}
} /// <summary>
/// 及时在窗体上现在程序的运行状态
/// </summary>
/// <param name="strMsg"></param>
/// <param name="c"></param>
public void MsgAppend(string strMsg, Color c)
{
this.BeginInvoke(new MethodInvoker(delegate()
{
int selectStart = rchtxt1.TextLength;
rchtxt1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + strMsg + Environment.NewLine);
rchtxt1.Select(selectStart, rchtxt1.TextLength - 1);
rchtxt1.SelectionColor = c;
}));
}
是因为这个,你在线程中操作了UI控件导致的,在更新UI控件之前,最好同步一下,使用:
if(control.InvokeRequired)
{
....
}
else
{
直接更新;
}网上有很多这样的例子;