我制作了一个示例项目。每隔10秒就有一些功能。但是当我试图在标签中显示计时器时,它总是卡住,然后跳到某个秒(eg: stuck at 9s and suddenly jump to 12s)
。我想问的是,
我的代码
private void button2_Click(object sender, EventArgs e)
{
timer1.Start();
}
int x = 0;
private void timer1_Tick(object sender, EventArgs e)
{
x += 1;
label1.Text = x.ToString();
if (x % 10 == 0)
{
addpoint();
//MessageBox.Show("success");
}
}
如何保持我的label1.text不断更新,同时执行addpoint()函数
注意:
我已设置timer1 interval = 1000
更新
我用它来测试它。
public void addpoint()
{
string x = @"c:\test\a.txt";
string text = "haiaiaia";
using (FileStream fs = new FileStream(x, FileMode.Create))
{
Byte[] xx = Encoding.ASCII.GetBytes(text);
fs.Write(xx, 0, xx.Length);
}
Messagebox.show("Created !");
}
答案 0 :(得分:1)
看起来您正在使用在主线程上执行的Windows.Forms.Timer。优点是您不需要调用Invoke,缺点是addpoint也在主线程上执行,因此阻止GUI进行更新,同时触发下一个tick事件。
您可以验证它是否正在用SUM
替换driver.manage().window().maximize();
的来电,您将会遇到相同的行为。
你可以做的是尝试在另一个线程上运行该方法:
WebElement element = Wait.wait.until(visibilityOfElementLocated(By.cssSelector(".logo-large")));
element.sendKeys(Keys.CONTROL , Keys.COMMAND , "f");
element.sendKeys(Keys.CONTROL , Keys.COMMAND , "F");
Actions action = new Actions(driver);
action.keyDown(Keys.CONTROL).keyDown(Keys.COMMAND).sendKeys("F").perform();
action.keyDown(Keys.CONTROL).keyDown(Keys.COMMAND).sendKeys("f").perform();
这应该避免阻止GUI。
声明:
了解您在addpoint
中实际执行的操作非常重要,因为此解决方案可能会导致竞争条件和方法的错误运行。例如,如果您在其中使用类变量,并且如果存在第二个线程可以在第一个尚未完成时启动的可能性!意识到。