Итак, я играл с VB.net и придумывал способы надежного запуска потока каждые 60 секунд, независимо от того, сколько времени потребовалось предыдущему потоку для выполнения своей работы. Вот мой вопрос. Учитывая следующий код:
Dim intTemp As Integer
intTemp = 2
Do While intTemp > 1
Dim objWriter As New System.IO.StreamWriter("C:\Documents\Visual Studio 2010\Projects\Report\Report\Stream.txt", True)
intTemp = intTemp + 1
System.Threading.Thread.Sleep(5000)
objWriter.Write(intTemp & " " & Date.Now & " " & Date.Now.Millisecond & vbCrLf)
objWriter.Close()
Loop
Создает это в файле stream.txt.
3 4/5/2011 9:41:27 AM 807
4 4/5/2011 9:41:32 AM 812
5 4/5/2011 9:41:37 AM 817
6 4/5/2011 9:41:42 AM 822
7 4/5/2011 9:41:47 AM 826
8 4/5/2011 9:41:52 AM 831
9 4/5/2011 9:41:57 AM 836
10 4/5/2011 9:42:02 AM 841
11 4/5/2011 9:42:07 AM 799
Мое предположение для этого вывода будет заключаться в том, что время между каждой строкой должно составлять ровно 5000 миллисекунд плюс время, необходимое для выполнения остальной части цикла, которое может варьироваться, учитывая, что может быть неизвестная задержка из-за дискового ввода-вывода. Моя проблема в том, что просмотр строк 10 и 11 и вычитание дает мне разницу в 4958 миллисекунд. Так что мой вопрос, что, черт возьми, происходит там? Как можно получить разницу менее 5000 миллисекунд, когда я сказал потоку спать в течение 5000 миллисекунд перед завершением процесса. Что мне не хватает?
Thread.Sleep
обычно не подходит для задачи синхронизации в целом. Обратите внимание наThreading.Timer
. Это все еще не дает всех гарантий, и может потребоваться более продвинутый подход (ext. lib) или ожидание вращения. Также убедитесь, что время выполнения рассчитывается изx = start + i * m
, а неx += m
, так как последнее во многих случаях приведет к ошибкам, как в приведенном выше примере. С осторожной формулой всегда можно отрегулировать назад. - person   schedule 06.04.2011