none
Параллельное чтение и обработка файлов RRS feed

  • Вопрос

  • Продолжение, начало см.
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/e830ac08-e9bc-4946-9606-b5c39d9ed09a
    Вот такой код получился, но как надо не работает -
    повторный клик на btStartStop 
    останавливает счетчики, но считывание файлов продолжается, 
    при этом начинает выскакивать сообщение об исключении на delegate
    OperationCanceledException -  The operation was canceled.
    Нажимаю F5 - продолжает читать файлы.
    Пытаюсь обработать это исключение пустым try-catch - ем -
    продолжается считывание файлов безо всяких сообщений.

     

    public partial class	MainForm	:	Form
    {	...
    	static CancellationTokenSource tokenSrc = new CancellationTokenSource();
    	static CancellationToken token = tokenSrc.Token;
    	...
    	private void Controller ()
    	{	Exec=!Exec;	CloseFileCount=0;
    		if	(Exec)	{	btStartStop.Text="Stop";	Ticker.Start();	stopWatch.Restart();	}
    		else	{	btStartStop.Text="Start";	Ticker.Stop();	stopWatch.Stop();	tokenSrc.Cancel();	}
    	}
    	private	void	btStartStop_Click ( object o,EventArgs e	)
    	{	Controller();
    		string fileLstPath=@"C:File.lst", fileFolder=Path.GetDirectoryName(fileLstPath);
    		...
    		ThreadPool.QueueUserWorkItem
    		(	delegate
    		{	File.ReadAllLines(fileLstPath)
    			.AsParallel()
    			.WithCancellation(tokenSrc.Token)
    			.Select((fileName) =>
    			Path.Combine(fileFolder, fileName+".txt"))
    			.ForAll(ProcessFileData);	
    			if (!token.IsCancellationRequested)	BeginInvoke	((Action)(() =>{	Controller(); }));
    		}
    		);
    	}	
    	public void ProcessFileData(string fullPath)
    	{	byte[] data = File.ReadAllBytes(fullPath);
    // Data Processing CloseFileCount=Interlocked.Increment(ref CloseFileCount); } }
     

     



Ответы

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]
  • Ладно, видимо, нет ответа на этот вопрос.
    В принципе FormClosing работает, значит можно обойтись и без Stop_Click.
    Всем спасибо! 
    • Помечено в качестве ответа Abolmasov Dmitry 19 мая 2011 г. 12:01