Вместо использования Thread.Sleep используйте очень узкий цикл и просто постоянно проверяйте разницу во времени.Вы могли бы даже сделать несколько умным, что для чего-то менее чем за секунду, вы просто работаете в замкнутом цикле и что-нибудь в течение секунды, вы продвигаетесь в течение 750 мс, а затем проверяете разницу и продолжаете делать это, пока она не станет меньше секунды.
Может быть, что-то вроде этого, класс для хранения ваших рабочих элементов:
public class workItem
{
public int offset { get; set; }
public string name { get; set; }
}
Тогда используйте это так:
Queue<workItem> items = new Queue<workItem>();
items.Enqueue(new workItem() { offset = 200, name = "A" });
items.Enqueue(new workItem() { offset = 220, name = "B" });
items.Enqueue(new workItem() { offset = 240, name = "C" });
items.Enqueue(new workItem() { offset = 230, name = "D" });
items.Enqueue(new workItem() { offset = 250, name = "E" });
items.Enqueue(new workItem() { offset = 260, name = "F" });
DateTime start = DateTime.Now;
Debug.Print(DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
while (items.Count > 0)
{
var currItem = items.Dequeue();
while (DateTime.Now < start.AddMilliseconds(currItem.offset))
{
}
Debug.Print("{0}: {1}", DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt"), currItem.name);
}
Это не идеально, потому что есть времямежду тем, когда прерывается цикл while и срабатывает отладка, но это должно вас сблизить.В некоторых комментариях также есть ссылки, которые могут быть полезны (например, с помощью WaitOne или параллельных задач)