我是线程新手,我正试图找出一种方法来使用任务来实现这一目标:
private void botCore()
{
if (CheckBox2.Checked == true)
{
Task Core = Task.Factory.StartNew(() =>
{
MessageBox.Show("Proxy -> Next");
Webbrowser1.Navigate("www.lalaland.com")
});
Core.ExecuteFor(2000)); // Executes the task above for only 2000 milliseconds then proceeds
if (Core.IsCompleted) // Checks if the 2000 milliseconds are up then executes another statement.
{
MessageBox.Show("Proxy -> Next after next");
Webbrowser1.Navigate("www.balalala.com")
ExecuteFor(3000) //Execute this for 3000 milliseconds.
}
Core.Stop();
}
}
基本上,我正在尝试运行一个任务达x个时间,一旦任务完成,它运行另一个任务x个时间并在循环中完成。如果这可以通过更好的方式完成,比如UI线程,请为我提供工作源。我对C#很新。感谢任何支持我的人。
答案 0 :(得分:1)
我在你的代码中看到了两个常见的错误假设:
如果您只想引入一些延迟,则不需要线程。您可以使用async
:
private async Task botCore()
{
if (CheckBox2.Checked == true)
{
MessageBox.Show("Proxy -> Next");
Webbrowser1.Navigate("www.lalaland.com")
await Task.Delay(2000);
MessageBox.Show("Proxy -> Next after next");
Webbrowser1.Navigate("www.balalala.com");
await Task.Delay(3000);
}
}
答案 1 :(得分:0)
一个简单的解决方案是调用Core.Wait(_time_to_wait_)
并检查返回值。如果为true,则任务完成。否则就错了。如果任务超时且您想要“杀死”它,请参阅:http://msdn.microsoft.com/en-us/library/dd537607.aspx
请注意,如果在Task.Wait
之后立即调用Task.Factory.StartNew
,则计时器可能会在执行任务之前超时,因为该任务首先被放入任务调度程序的队列中,并且可能存在任务初始化和执行之间有明显的延迟。为了避免这种情况(如果你想在重负载下进行精确的时间控制,这是发生延迟的主要方案),请向任务添加一个额外的信号,并先等待它:
var started = new ManualResetEventSlim(false);
var t = Task.Factory.StartNew(() =>
{
started.Set();
//...
});
started.Wait();
t.Wait(2000);
答案 2 :(得分:0)
如果你问我,我会说开始使用方法。这是一个开始。 除此之外,看看这个例子..它没有解释所有,但它没关系。 http://msdn.microsoft.com/en-us/library/dd537610.aspx
注意:您可以等待任务。但它会在完成后完成。 2000毫秒后它不会自动关闭。您需要手动执行此操作
除了尝试这个例子,..没有测试它。
private void botCore()
{
if (CheckBox2.Checked == true)
{
Task coreTask = Task.Factory.StartNew(() => printMessage("1", "www.google.nl"));
await Task.Delay(2000);
coreTask.Stop() // AS you asked that it will stop.
if (coreTask.IsCompleted) // Checks if the 2000 milliseconds are up then executes another statement.
{
Task coreTask2 = Task.Factory.StartNew(() => printMessage("2", "www.google.nl?p=2"));
await Task.Delay(3000);
coreTask2.Stop() // AS you asked that it will stop.
}
Core.Stop();
}
}
public void printMessage(string text, string url){
MessageBox.Show("Proxy -> " + text);
Webbrowser1.Navigate(url)
}