Это природа математики конечной точности. Если вы попытаетесь сохранить значение, которое не может быть представлено точно, в лучшем случае вы получите наиболее близкое представимое значение.
Посмотрите на двоичный файл:
999900032 -> 111011100110010100001110000000
999900000 -> 11101110011001010000110 11 00000
Таким образом, представление этого числа будет требуют двух дополнительных битов точности. Предположительно, это больше, чем float
обеспечивает в вашей системе.
Это - действительно очень плохой дизайн, уже не говоря об одиночном элементе отдельно плохой дизайн.
Однако, если действительно необходимо задержать выполнение, вот то, что можно сделать:
BackgroundWorker barInvoker = new BackgroundWorker();
barInvoker.DoWork += delegate
{
Thread.Sleep(TimeSpan.FromSeconds(1));
bar();
};
barInvoker.RunWorkerAsync();
Это, однако, вызовет bar()
на отдельный поток. Если необходимо звонить bar()
в исходный поток, Вы, возможно, должны были бы переместиться bar()
вызов в RunWorkerCompleted
обработчик или сделать немного взламывания с SynchronizationContext
.
Это походит на управление создания и этих объектов и их потребности взаимозависимости к управляемому внешне, а не между самими классами.
Ну, я должен был бы согласиться с точкой зрения "дизайна"..., но можно, вероятно, использовать Монитор для уведомления того, когда другой проходит критический раздел...
public void foo() {
// Do stuff!
object syncLock = new object();
lock (syncLock) {
// Delayed call to bar() after x number of ms
ThreadPool.QueueUserWorkItem(delegate {
lock(syncLock) {
bar();
}
});
// Do more Stuff
}
// lock now released, bar can begin
}
Нет никакого стандартного способа задержать вызов к функции кроме использовать таймер и события.
Это походит на GUI анти-шаблон задержки вызова к методу так, чтобы можно было быть уверены, что форма закончила размечать. Не хорошая идея.