2010-07-02 3 views
0

Мне нужно создать уникальное имя файла в многопоточном приложении, которое сериализует некоторые данные на диске. Какой подход можно использовать для обеспечения уникального имени. Приложение не было многопоточным раньше и использовало Ticks. При использовании нескольких потоков он провалился намного быстрее, чем я ожидал. я теперь добавил CurrentThreadId к имени файла, и что нужно сделать, этоПолучите уникальное имя файла в многопоточном приложении

string.Format("file_{0}_{1}.xml", DateTime.Now.Ticks, Thread.CurrentThread.ManagedThreadId) 

Есть ли «умнее» способ сделать это?

ответ

9

Как насчет Guid.NewGuid() вместо идентификатора потока?

string.Format("file_{0}_{1:N}.xml", DateTime.Now.Ticks, Guid.NewGuid()) 

Сохраняя тики, как часть имени, фамилии все равно будут в приблизительном порядке даты, если порядок важен.

{1: N} избавляется от фигурных скобок и тире в направляющей. .

Кроме того, рассмотреть вопрос об использовании DateTime.UtcNow.Ticks, с тем чтобы гарантировать дополнительные тики, когда летнее время пинки в

+0

Спасибо, что я не был уверен в уникальности руководства через нить. Я думал, что они были солеными с текущим временем, что не помогло бы в потоках –

+0

Вы правы - метка времени является основным компонентом Guid, но алгоритм также поддерживает свой собственный уникальный счетчик для обработки «одновременных» запросов. Прямое разбиение алгоритма находится здесь: http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx –

1

В зависимости от ваших потребностей, вы можете попробовать:

System.IO.Path.GetTempFileName();

Это создает временный файл с уникальным именем в каталоге% temp%. Я полагаю, вы можете скопировать файл в целевое местоположение до или после его написания.

+0

Это гарантирует, что имя файла уникально в каталоге temp - не на Целевое местоположение OP. –

0

Чтобы фактически зарезервировать имя файла, Вы должны будете немедленно создать файл и проверить исключения.

Другим вариантом является включение значения Guid в ваше имя файла.

Смежные вопросы