我有这样特殊的代码:
for (int i = 0; i < SingleR_mustBeWorkedUp._number_of_Requestes; i++)
{
Random myRnd = new Random(SingleR_mustBeWorkedUp._num_path);
while (true)
{
int k = myRnd.Next(start, end);
if (CanRequestBePutted(timeLineR, k, SingleR_mustBeWorkedUp._time_service, start + end) == true)
{
SingleR_mustBeWorkedUp.placement[i] = k;
break;
}
}
}
我在这里使用无限循环,只有在CanRequestBePutted
返回true
时才会结束。那么如何知道应用程序没有响应?
通过控制每个循环的工作时间有一个解决方案,但它似乎并不是真的很好。而且我无法预测在每种情况下都会发生这种情况。
任何解决方案?
答案 0 :(得分:5)
如果您担心此操作可能需要足够长的时间才能让应用程序的用户注意到,那么您应该在非UI线程中运行它。然后,您可以确定它不会使您的应用程序不重复。你应该只在UI线程中运行它,如果你确定它将总是很快完成。如有疑问,请转到非UI线程。
不要试图动态地判断操作是否需要很长时间。如果需要一段时间是可能的,请在另一个线程中完成工作。
答案 1 :(得分:0)
为什么不使用任务或线程池,这样你就不会阻塞并在其上放置计时器?
任务看起来像这样:
//put a class level variable
static object _padlock = new object();
var tasks = new List<Task>();
for (int i = 0; i < SingleR_mustBeWorkedUp._number_of_Requestes; i++)
{
var task = new Task(() =>
{
Random myRnd = new Random(SingleR_mustBeWorkedUp._num_path);
while (true)
{
int k = myRnd.Next(start, end);
if (CanRequestBePutted(timeLineR, k, SingleR_mustBeWorkedUp._time_service, start + end) == true)
{
lock(_padlock)
SingleR_mustBeWorkedUp.placement[i] = k;
break;
}
}
});
task.Start();
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
然而,我也会尝试找出一种方法来取消你的时间(真实),这有点危险。此外,任务需要.NET 4.0或更高版本,我不确定您的目标是什么框架。
如果您需要更旧的东西,可以使用ThreadPool。
此外,您可能希望将锁定放在共享资源(如SingleR_mustBeWorkedUp.placement)或其他任何可能正在更改变量的位置。我以SingleR_mustBeWorkedUp.placement为例。