我有一種方法,基本上從遠程系統複製文件到我們的本地系統。這種方法需要在一小時內執行4次,每15分鐘執行一次。該方法使用Period作爲參數調用,其中Period的範圍是0-3(0 = Min:0-15; 3 = Min:45-0)。在這種情況下使用線程?
我如何運行這些作爲獨立的線程,然後接下來的一個小時之前停止所有的人:20來,這樣我可以調用外部程序ProcessFiles.EXE?我總是可以繼續線程化,但是我不知道讀取文件的程序是如何線程安全的。所以我更喜歡在下一個之前削減所有線程:20來臨。
之前,15分鐘的窗口是不是足夠複製所有掉進這個15分鐘的窗口中的文件的更多。不幸的是,這個過程變得非常緩慢。所以,假設我正在運行第一個IF語句(at:20),而不是在達到35分鐘時停止它,我可以讓它在一個線程中運行,直到小時結束。但是如果在下一個:20之後沒有完成,那麼該線程需要被停止。
編輯:這曾經是在任務計劃程序。該任務會將20個文件複製15分鐘的時間。不幸的是,文件複製變得非常緩慢。所以,現在,在某些塊中,文件副本需要超過15分鐘。
所以我最初的想法是線程這些過程。在第一個15分鐘塊(IF語句運行於分鐘20,將文件從Min.00複製到Min.1)的情況下,假設我使用了一個線程。這意味着,即使沒有完成分35(其中複製15.分鐘,30.分鐘的過程開始),它仍然有直到分鐘下一次迭代的20(第一IF的聲明循環)。
調度程序的缺點是,如果任務未按時完成,它將1)阻止調度程序再次運行任務,或2)如果強制它關閉,只複製部分內容被複制。
下面是我的一些代碼,所以你有什麼我工作的一個想法:
public static void Main(string[] args)
{
DateTime DateNow = new DateTime(2014, 3, 1, 5, 0, 0); //For the example, start at 5AM.
Thread thread0 ;
Thread thread1 ;
Thread thread2 ;
Thread thread3 ;
for (; ;) //infinite loop
{
//DateNow will usually be DateTime.Now.
if (DateNow.Minute == 20)
{
//Copy files from 5:00-5:15.
//IF any of the threads from Hour 4 are still running, they must be stopped
_CurrentHour = DateNow.Hour;
thread0 = new Thread(() => CopyFiles(_CurrentHour, 0));
thread0.Start();
}
else if (DateNow.Minute == 35)
{
//Copy files from 5:15-5:30.
thread1 = new Thread(() => CopyFiles(_CurrentHour, 1));
thread1.Start();
}
else if (DateNow.Minute == 50)
{
//Copy files from 5:30-5:45.
thread2 = new Thread(() => CopyFiles(_CurrentHour, 2));
thread2.Start();
}
else if (DateNow.Minute == 5)
{
//Copy files from 5:45-6:00.
thread3 = new Thread(() => CopyFiles(_CurrentHour, 3));
thread3.Start();
}
thread0.Join();
thread1.Join();
thread2.Join();
thread3.Join();
//CALL ProcessFiles.EXE
}
}
其他程序是「別的東西」嗎?跨進程線程同步非常不平凡。 – BradleyDotNET
「別的東西」是另一個程序。 – vmgmail
這不會拋出null參考?你的無限循環只能根據分鐘創建thread0,1,2,3 ... –