Простенький пример
от Ayende Rahien
var stats = new PerformatStats
{
Size = largeData.Length
};
stats.OnCompletion += () => this.RecordCompletion(stats);
Write(stats, o =>
{
var sp = new Stopwatch();
foreach (var item in largeData)
{
sp.Restart();
// do something with this
stats.RecordOperationDuration(sp);
}
});
`stats` — долгоживущий объект, largeData — короткоживущий, зато большой, Write() отрабатывает быстро (в сравнении с временем жизни stats). Казалось бы, что тут может пойти не так?(c) Подробности — по ссылке выше.
И для любителей детективов на вечер: code review одного
мааленького исправления в roslyn (часть комментариев скрыта под "Show outdated diff", Github всё-таки фигово приспособлен для длинных обсуждений).
Тот же самый "что тут может пойти не так?", только гораздо круче
UPD Чтобы не плодить посты: ещё один wtf moment, на этот раз
от Ben Watson.
class App
{
public bool IsRunning {get; set;}
private Thread houseKeepingThread;
public void Start()
{
this.IsRunning = true;
this.houseKeepingThread = new Thread(ThreadFunc);
this.houseKeepingThread.Start();
}
private void ThreadFunc()
{
while (this.IsRunning)
{
DoWork();
// wait for 30 seconds
}
}
};
Снова "что тут может пойти не так?", только теперь
| подсказка |
| банановый с volatile |
| |