Object.prototype.toString.call(myVar)
вернет:
"[object Object]"
, если myVar - объект "[object Array]"
, если myVar - массив Для получения дополнительной информации об этом и почему это хорошая альтернатива typeof, ознакомьтесь с этой статьей .
Есть способ лучше - либо использовать Monitor.Wait
/ Pulse вместо Sleep / Interrupt, либо использовать Auto
] / ManualResetEvent
. (В этом случае вам, вероятно, понадобится ManualResetEvent
.)
Лично я фанат Wait / Pulse, вероятно, из-за того, что это похоже на механизм Java wait () / notify (). Однако бывают случаи, когда события сброса более полезны.
Ваш код будет выглядеть примерно так:
private readonly object padlock = new object();
private volatile bool stopping = false;
public void Stop() // Could make this Dispose if you want
{
stopping = true;
lock (padlock)
{
Monitor.Pulse(padlock);
}
}
private void ThreadedWork()
{
while (!stopping)
{
DoWork();
lock (padlock)
{
Monitor.Wait(padlock, TimeSpan.FromMinutes(15));
}
}
}
Для получения дополнительных сведений см. Мое руководство по потокам , в частности, страницы на взаимоблокировки, ожидания и пульсации , страница на обрабатывает ожидание . У Джо Альбахари также есть учебное пособие , которое охватывает те же темы и сравнивает их.
Я еще не рассматривал подробно, но не стал бы '
Вы можете использовать событие, чтобы проверить, должен ли процесс заканчиваться следующим образом:
var eventX = new AutoResetEvent(false);
while (true)
{
if(eventX.WaitOne(900000, false))
{
break;
}
DoWork();
}
Одним из способов может быть добавление события отмены или делегата, на который будет подписан поток. Когда вызывается событие отмены, поток может остановиться.