C# 独立线程中的计时器
我想在一个单独的线程中创建一个计时器,但我不知道如何做。 单击按钮a后,计时器应停止 下面我举了一个例子,这个例子大部分是有效的,但是当循环执行时,它有时会停止1-2秒。所以我想我必须把它放在一个单独的线程中?这就是我尝试过的:C# 独立线程中的计时器,c#,timer,C#,Timer,我想在一个单独的线程中创建一个计时器,但我不知道如何做。 单击按钮a后,计时器应停止 下面我举了一个例子,这个例子大部分是有效的,但是当循环执行时,它有时会停止1-2秒。所以我想我必须把它放在一个单独的线程中?这就是我尝试过的: private void buttonStop_Click(object sender, EventArgs e) { timer1.Stop(); } public void TimeThread() {
private void buttonStop_Click(object sender, EventArgs e)
{
timer1.Stop();
}
public void TimeThread()
{
th = new Thread(new ThreadStart(Timer));
th.Start();
}
public void Timer()
{
var delta = DateTime.Now - startTime;
textBoxSeconds.Text = delta.Seconds.ToString("n0");
textBoxMinutes.Text = Math.Floor(delta.TotalMinutes).ToString("n0");
}
编辑: 下面是我所有的代码,仍然不确定如何将计时器放在单独的线程中
namespace Imgur
{
public partial class Form1 : Form
{
bool flag = true;
int downloadedNumber = 0;
private DateTime startTime;
public Form1()
{
InitializeComponent();
}
public void buttonStart_Click(object sender, EventArgs e)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
if (!flag)
{
flag = true;
}
startTime = DateTime.Now;
timer1.Start();
for (int i=0;i<100000 && flag;i++)
{
WebClient webClient = new WebClient();
string pic1 = rnd_str(5);
string pic2 = ".jpg";
string picture = pic1 + pic2;
//********** GETTING SIZE OF IMAGE ***********
Size sz = GetSize("http://i.imgur.com/" + picture);
string imageSize = (sz.Width.ToString() + " " + sz.Height.ToString()); ;
//********************************************
if(imageSize != "161 81")
{
webClient.DownloadFile("http://i.imgur.com/" + picture, @"e:\test\" + picture);
richTextBox1.Text += String.Format("Downloaded picture: {0}\r\n", picture);
downloadedNumber++;
textBoxDownloadedNumber.Text = string.Format("{0}", downloadedNumber);
}
webClient.Dispose();
Application.DoEvents();
if (i == 999995)
{
flag = false;
}
}
richTextBox1.Text += "End Dowloaded Session \n";
buttonStart.Enabled = true;
buttonStop.Enabled = false;
timer1.Stop();
}
public static Size GetSize(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.Accept = "image/gif";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream s = response.GetResponseStream();
Bitmap bmp = new Bitmap(s);
Size sz = new Size(bmp.Width, bmp.Height);
return sz;
}
public static string rnd_str(int liczba_liter)
{
Random r = new Random();
int char_type;
string return_string = "";
int i =0;
for (i = 0; i < liczba_liter; i++)
{
if (r.Next(1, 3) == 1)
{
char_type = r.Next(1, 4);
switch (char_type)
{
case 1:
return_string += (char)r.Next(48, 58); // convertion int -> ASCII character; 48-57 are ASCII digits
break;
case 2:
return_string += (char)r.Next(97, 123); // convertion int -> ASCII character; as above but small letters
break;
case 3:
return_string += (char)r.Next(65, 91); // as above; large letters
break;
default:
i -= 1;
break;//do not add any letter if no type is allowed
}
}
else
{
i -= 1;
return_string += "";
}
}
return return_string;
}
private void buttonStop_Click(object sender, EventArgs e)
{
flag = false;
buttonStart.Enabled = true;
timer1.Stop();
}
public void timer1_Tick(object sender, EventArgs e)
{
var delta = DateTime.Now - startTime;
textBoxSeconds.Text = delta.Seconds.ToString("n0");
textBoxMinutes.Text = Math.Floor(delta.TotalMinutes).ToString("n0");
}
}
}
名称空间Imgur
{
公共部分类Form1:Form
{
布尔标志=真;
int downloadedNumber=0;
私人日期时间开始时间;
公共表格1()
{
初始化组件();
}
公共无效按钮开始单击(对象发送者,事件参数e)
{
buttonStart.Enabled=false;
buttonStop.Enabled=true;
如果(!标志)
{
flag=true;
}
startTime=DateTime.Now;
timer1.Start();
for(int i=0;i ASCII字符;48-57为ASCII数字
打破
案例2:
返回_string+=(char)r.Next(97123);//转换int->ASCII字符;如上所述,但为小写字母
打破
案例3:
return_string+=(char)r.Next(65,91);//如上所述;大号字母
打破
违约:
i-=1;
break;//如果不允许使用任何类型,则不要添加任何字母
}
}
其他的
{
i-=1;
返回字符串+=“”;
}
}
返回字符串;
}
私有无效按钮停止单击(对象发送者,事件参数e)
{
flag=false;
buttonStart.Enabled=true;
timer1.Stop();
}
public void timer1_Tick(对象发送方,事件参数e)
{
var delta=DateTime.Now-startTime;
textBoxSeconds.Text=delta.Seconds.ToString(“n0”);
textBoxMinutes.Text=Math.Floor(delta.TotalMinutes.ToString(“n0”);
}
}
}
在您的代码中,计时器和所经过时间的打印之间似乎没有连接。
您需要注意,因为不可能从另一个非主线程更改GUI元素。
为此,需要在WinForms中使用Invoke
if (control.InvokeRequired)
{
control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object[] { control, propertyName, propertyValue });
}
else
{
control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue });
}
或WPF/SL中的调度员-
为了使用另一个线程,您有一些选项:
如果您不知道如何使用ARDS,那么第三个选项是最简单的。Net中有树计时器。请参阅下面的文章并选择正确的选项,看起来您需要的计时器来自
系统。线程,而不是系统.Windows.Forms
,计时器已在(单独的)中线程。还有其他事情在进行。代码没有意义。什么“循环”?带名称空间的timer1
的类型是什么?如果不关心答案,为什么要问问题?