2013-04-11 2 views
2

Я использую Filesystemwatcher, чтобы забрать файл, преобразовать его в UTF-8 и перенести его в пункт назначения. Теперь, чего я хочу достичь, мне нужно отложить xml, который записывается в пункт назначения. т. е. через 15-20сек. Я знаю, что я могу использовать следующее здесь:C# Задержка записи в XML

System.Threading.Thread.Sleep(milliseconds); 

Но если я это сделаю, это задержит нить полностью не будет его. Что произойдет с файловым накопителем, перестанет ли он собирать файлы. Моя цель - задержать, но не пропустить файлы, которые будут изменены в исходной папке. Вот как я это делаю на данный момент:

var doc = new XmlDocument(); 
doc.Load(FileName); 
XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }; 
using (var writer = XmlWriter.Create(destinationFile, settings)) 
{ 
    System.Threading.Thread.Sleep(15000); 
    doc.Save(writer); 
} 

Это остановит нить и задержки записи в файл XML, который является то, что я хочу. Но что будет с наблюдателем файловой системы, тогда это тоже остановится - так как это часть того же потока.

+0

Задержка в новом потоке: http://stackoverflow.com/questions/6913589/c-sharp-delaying-a-thread –

+0

У вас есть для использования [Thread] (http://msdn.microsoft.com/en-us/library/aa645740 (v = vs.71) .aspx): создайте его, когда 'FilesystemWatcher' найдет новый файл, запустите его, забудьте об этом .. в потоке сделайте 'Thread.Sleep (15000);' и только затем создайте новый файл и сохраните его. – Sinatr

+0

'Task.Delay (15000) .ContinueWith (_ => doc.Save (writer));' ??? – I4V

ответ

2

Вы можете использовать System.Threading.Timer класса

var doc = new XmlDocument(); 
doc.Load(FileName); 
XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }; 

new System.Threading.Timer((_) => 
    { 
     using (var writer = XmlWriter.Create(destinationFile, settings)) 
     { 
      doc.Save(writer); 
     } 
    }) 
.Change(15000, -1); 
+1

отлично работает !!! благодаря – user726720

1

создать поток для материала, который Вы хотите, чтобы задержать и отдельный поток для материала, который Вы не хотите, чтобы задержать

Edit Попробуйте

System.Threading.Thread newThread; 
newThread = new System.Threading.Thread(anObject.AMethod); // one to delay 

System.Threading.Thread newThread2; 
newThread2 = new System.Threading.Thread(anObject.AMethod); //one not to delay 

Затем добавьте Threadname.Start(); к началу процедура, которую вы хотите отложить, а другая - на ту, которую вы не хотите задерживать. Затем оттянуть тот, который вы хотите задержать с помощью

System.Threading.Thread.Sleep(milliseconds); 

, как вы делали раньше

Надеются, что это помогает

+0

Спасибо, друг пожалуйста, предоставьте мне короткий пример вашей идеи. – user726720

+0

См. ссылку, которую я опубликовал, есть образец кода! –

0

Что об использовании BlockingCollection?
Он доступен в 4.0.
Файловая система является производителем, а потребителем является xmlwrite.
Вы можете спать у потребителя и не влиять на производителя.

BlockingCollection Class

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