我确实有一种方法,在一个任务中运行该方法的执行时间可能需要一段时间(大约2分钟):
public Task BaseWorkerTask { get; set; }
public void Initialize()
{
BaseWorkerTask = Task.Run(() =>
{
BaseWorker();
});
}
public void BaseWorker()
{
Server.Speak(Packet.Greeting);
while (WaitServerResponse())
{
DoSomethingElse();
}
var response = Server.GetResponse();
if (response.Equals("abc"))
{
DoAbcTask();
}
else if (response.Equals("def"))
{
[...]
}
[...]
}
我希望能够在给定的时间段内中断其执行,以便进行其他一些服务器调用。这里要注意的重要一点是,我希望它在BaseWorker
方法的当前行“暂停”脚本的执行,就在它的确切位置。
类似的东西:
if (!BaseWorkerTask.IsCompleted)
{
// Pause to do something else
// BaseWorkerTask.StopAtCurrentPlace();
DoSomethingElse();
// Once something else is done, resume BaseWorkerTask
// BaseWorkerTask.Resume();
}
可以实现这种方法吗?
我一直在尝试阻塞线程,但是一旦方法在System.Threading.Thread.Sleep(...)
中使用了无限循环后,我就只能阻塞它。
答案 0 :(得分:1)
Thread.Suspend
可能是您最接近的,但是它被 标记为过时 ,并带有以下(相关)警告:
请勿使用Suspend和Resume方法来同步线程的活动。您无法知道挂起线程时正在执行什么代码。如果在安全权限评估期间暂停线程持有锁的线程,则AppDomain中的其他线程可能会被阻止。如果在执行类构造函数时挂起线程,则AppDomain中尝试使用该类的其他线程将被阻止。死锁很容易发生。
简而言之,由于与上述完全相同的原因,任何可以做到这一点的方法都是一个坏主意。
尝试在线程池线程上使用它实际上可以确保您出现故障。
如果要执行此操作,则必须考虑一种可以在任务暂停中进行协作的方式。可能会涉及到在代码中添加同步内容。
反正花了这么长时间?
答案 1 :(得分:0)
我将使用某种bool
标志,类似于取消令牌。当您要暂停执行任务时,将其设置为true
,并在BaseWorker
内部检查变量的值。如果是true
,请使用Thread.Sleep
暂停执行,直到将其设置为false
。
示例:
bool suspendExecution = false;
public void Initialize()
{
BaseWorkerTask = Task.Run(() =>
{
BaseWorker(ref suspendExecution);
});
}
public void BaseWorker(ref bool suspend)
{
while (WaitServerResponse())
{
if (suspend)
{
while (suspend)
{
Thread.Sleep(1000);
}
}
DoSomethingElse();
}
}