Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2009, 20:55   #1
Neymexa
Proffesional
Форумчанин
 
Аватар для Neymexa
 
Регистрация: 18.11.2008
Сообщений: 417
По умолчанию backgroundworker

не подскажете реализацию этого компонента в winforms проекте?
не знаю как подойти к решению данного вопроса?
вот код
Код:
namespace WindowsFormsApplication_test_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            toolStripProgressBar1.Visible = false;
            toolStripStatusLabel1.Visible = false;
            //Control.CheckForIllegalCrossThreadCalls = false; //это необходимо для того, что бы разрешить межпотоковые вызовы для управления визуальными элементами на форме
            //sTh = new Thread(new ThreadStart(XMLWorker)); //создаем параллельный поток из нашего метода
        }

        private void button2_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.ShowDialog();
            textBox1.Text = folderBrowserDialog1.SelectedPath;
        }
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            toolStripProgressBar1.Value = e.ProgressPercentage;//процент выполнения
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Thread t = new Thread(XMLMove);
            backgroundWorker1.RunWorkerAsync(XMLMove());
            button1.Enabled = false;
            while (this.backgroundWorker1.IsBusy)
            {
                Application.DoEvents();
            }
            button1.Enabled = true;

        }

        private void XMLMove(object sender, DoWorkEventArgs e)
        {
            try
            {
                DirectoryInfo di = new DirectoryInfo(textBox1.Text);
                FileInfo[] array = di.GetFiles("*.xml");
                for (int i = 0; i < array.Length; i++)
                {
                    bool zn = true;
                    XPathDocument doc = new XPathDocument(textBox1.Text + "\\" + array[i]);
                    XPathNavigator navigator = doc.CreateNavigator();

                    for (int j = 0; j < listView1.Items.Count; j++)
                    {
                        XPathNodeIterator nodes = navigator.Select(listView1.Items[j].SubItems[1].Text);
                        if (nodes.MoveNext())
                        {
                            toolStripProgressBar1.Maximum = i;
                            toolStripProgressBar1.Value = i;
                            toolStripProgressBar1.Visible = true;
                            toolStripStatusLabel1.Visible = true;
                            toolStripStatusLabel1.Text = "Идет перемещение из" + textBox1.Text + " в " + listView1.Items[j].Text;
                            File.Move(textBox1.Text + "\\" + array[i], listView1.Items[j].Text + "\\" + array[i]);
                            zn = false;

                            break;
                        }
                    }
                    if (zn == true)
                    {
                        //MessageBox.Show("naideno");
                        File.Move(textBox1.Text + "\\" + array[i], @"C:\Users\User" + "\\" + array[i]);
                        toolStripStatusLabel1.Text = "Идет перемещение из" + textBox1.Text + " в " + @"C:\Users\User";

                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            } 
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }
    }
}
пытаюсь применить прочитанное не получается
жду предложений заранее спс
О, степь родимая, как я скучаю по тебе...
Neymexa вне форума Ответить с цитированием
Старый 06.05.2009, 12:38   #2
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
Радость

Цитата:
Сообщение от Neymexa Посмотреть сообщение
пытаюсь применить прочитанное не получается
жду предложений заранее спс
Сделай событие DoWork и засунь в него то что хочешь загрузить асинхронно, иными словами твой код. Потом в клик кнопки или ещё где запихни его вызов, то есть у бекграундворкера есть такая штука RunWorkerAsync, вот его. При нажатии на кнопку у тебя всё запустится.

Хотя мне этот класс вообще неудобен и я сделал свой. Надеюсь я рабочую версию откопал.

первая часть (из за ограничений в длине сообщений)
Код:
using System;
using System.Threading;

namespace System.Threading
{
	/// <summary>
	/// Потоковый рабочий.
	/// </summary>
	public class ThreadWorker
	{
		#region " Объекты "

		/// <summary>
		/// Наибольшее количество миллисекунд периода задержки.
		/// </summary>
		const int MAX_MILLISECONDS = 1000;

		/// <summary>
		/// Рабочий поток.
		/// </summary>
		private Thread workingThread;

		/// <summary>
		/// Период задержки.
		/// </summary>
		private TimeSpan _periodDelay;

		/// <summary>
		/// Предыдущее время события прогресса.
		/// </summary>
		private DateTime _previousTime;

		/// <summary>
		/// Очерёдность потока.
		/// </summary>
		private ThreadPriority _priority;

		#endregion

		#region " Предустановка "

		/// <summary>
		/// Конструктор со значением.
		/// </summary>
		/// <param name="threadPriority">Очерёдность потока.</param>
		public ThreadWorker(ThreadPriority threadPriority)
		{
			// Задаём очерёдность потока.
			Priority = threadPriority;
		}

		/// <summary>
		/// Конструктор со значением.
		/// </summary>
		/// <param name="periodDelay">Период задержки.</param>
		public ThreadWorker(TimeSpan periodDelay)
		{
			// Задаём период задержки.
			PeriodDelay = periodDelay;
		}

		/// <summary>
		/// Конструктор со значением.
		/// </summary>
		/// <param name="threadPriority">Очерёдность потока.</param>
		/// <param name="periodDelay">Период задержки.</param>
		public ThreadWorker(ThreadPriority threadPriority, TimeSpan periodDelay)
		{
			// Задаём свойства потокового рабочего.
			Priority = threadPriority;
			PeriodDelay = periodDelay;
		}

		#endregion

		#region " Свойства "

		/// <summary>
		/// Период задержки.
		/// </summary>
		/// <exception cref="ArgumentOutOfRangeException">Если период задержки больше одной секунды или отрицателен.</exception>
		public TimeSpan PeriodDelay
		{
			get
			{
				return _periodDelay;
			}
			set
			{
				if (value.Milliseconds > MAX_MILLISECONDS || value.Milliseconds < 0)
					throw new ArgumentOutOfRangeException();
				_periodDelay = value;
			}
		}

		/// <summary>
		/// Очерёдность потока.
		/// </summary>
		public ThreadPriority Priority
		{
			get
			{
				return _priority;
			}
			set
			{
				try
				{
					workingThread.Priority = value;
				}
				catch (NullReferenceException)
				{
					// Подавляем исключение если поток равен нулю.
				}
				catch (ThreadStateException)
				{
					// Подавляем исключение при блокировке приоритета.
				}
				_priority = value;
			}
		}

		#endregion

		#region " Методы "

		/// <summary>
		/// Запустить фоновый поток.
		/// </summary>
		public void Start()
		{
			try
			{
				if (!workingThread.IsAlive) // Если поток не занят.
				{
					CompleteStart(); // Завершить старт.
				}
			}
			catch (NullReferenceException)
			{
				CompleteStart(); // Завершить старт.
			}
		}
atomicxp вне форума Ответить с цитированием
Старый 06.05.2009, 12:39   #3
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
Сообщение

Код:
		/// <summary>
		/// Завершить старт.
		/// </summary>
		private void CompleteStart()
		{
			// Создание и запуск рабочего потока.
			workingThread = new Thread(new ThreadStart(StartAsync));
			workingThread.Priority = Priority;
			workingThread.Name = "вторичный поток"; // HACK
			workingThread.IsBackground = true; // HACK
			workingThread.Start();

			// HACK ---------------------------
			eh = new OnEventHandler(OnStoped);
			ep = new OnEventHandler(OnProgressed);
		}

		OnEventHandler eh;
		OnEventHandler ep;

		public delegate void OnEventHandler(EventArgs e); // HACK ---------------------------

		/// <summary>
		/// Запустить фоновый поток в асинхронном режиме.
		/// </summary>
		private void StartAsync()
		{
			// Первая установка предыдущего времени прогресса.
			_previousTime = DateTime.Now;

			// Событие начала работы.
			OnStarted(new EventArgs());

			// Вызов прогресса после выхода.
// HACK			_previousTime = DateTime.Now;
// HACK			OnProgressed(new EventArgs());

			// Событие окончания работы.
			eh.BeginInvoke(new EventArgs(), null, null);
			//OnStoped(new EventArgs()); HACK
		}

		/// <summary>
		/// Остановить фоновый поток.
		/// </summary>
		public void Stop()
		{
			try
			{
				// Если поток приостановлен.
				if (workingThread.ThreadState == ThreadState.Suspended)
				{
					workingThread.Resume(); // Возобнови его.
				}
				workingThread.Abort();
				
				// Событие окончания работы.
				OnStoped(new EventArgs());
			}
			catch (NullReferenceException)
			{
				// Подавить исключение если объект рабочего потока равен нулю.
			}
		}

		/// <summary>
		/// Приостановить фоновый поток.
		/// </summary>
		public void Suspend()
		{
			try
			{
				workingThread.Suspend();
				
				// Событие приостановки работы.
				OnSuspended(new EventArgs());
			}
			catch (ThreadStateException)
			{
				// Подавить исключение.
			}
		}

		/// <summary>
		/// Возобновить фоновый поток.
		/// </summary>
		public void Resume()
		{
			try
			{
				workingThread.Resume();
				
				// Событие возобновления работы.
				OnResumed(new EventArgs());
			}
			catch (ThreadStateException)
			{
				// Подавить исключение.
			}
		}
		
		/// <summary>
		/// Сообщить о произошедшем прогрессе.
		/// </summary>
		/// <remarks>Событие прогресса будет вызвано спустя заданный период времени.</remarks>
		public void ReportProgress()
		{
			// Если период задержки вышел.
			if (DateTime.Now.Subtract(_previousTime).Milliseconds >= PeriodDelay.Milliseconds)
			{
				// Сбрасываем время и вызываем свойство прогресса.
				_previousTime = DateTime.Now;
				//OnProgressed(new EventArgs()); HACK
				ep.BeginInvoke(new EventArgs(), null, null);
			}
		}

		#endregion

		#region " События "

		/// <summary>
		/// Вызов события запуска фонового потока.
		/// </summary>
		protected virtual void OnStarted(EventArgs e)
		{
			if (Started != null)
			{
				Started(this, e);
			}
		}

		/// <summary>
		/// Вызов события приостановки фонового потока.
		/// </summary>
		protected virtual void OnStoped(EventArgs e)
		{
			if (Stoped != null)
			{
				Stoped(this, e);
			}
		}

		/// <summary>
		/// Вызов события возобновления фонового потока.
		/// </summary>
		protected virtual void OnSuspended(EventArgs e)
		{
			if (Suspended != null)
			{
				Suspended(this, e);
			}
		}

		/// <summary>
		/// Вызов события завершения фонового потока.
		/// </summary>
		protected virtual void OnResumed(EventArgs e)
		{
			if (Resumed != null)
			{
				Resumed(this, e);
			}
		}

		/// <summary>
		/// Вызов события произошедшего прогресса.
		/// </summary>
		protected virtual void OnProgressed(EventArgs e)
		{
			if (Progressed != null)
			{
				Progressed(this, e);
			}
		}

		/// <summary>
		/// Возникает при запуске фонового потока.
		/// </summary>
		/// <remarks>В обработчике находится операция для выполнения в фоновом режиме.</remarks>
		public event System.EventHandler Started;
		/// <summary>
		/// Возникает при завершении фонового потока.
		/// </summary>
		public event System.EventHandler Stoped;
		/// <summary>
		/// Возникает при приостановке фонового потока.
		/// </summary>
		public event System.EventHandler Suspended;
		/// <summary>
		/// Возникает при возобновлении фонового потока.
		/// </summary>
		public event System.EventHandler Resumed;
		/// <summary>
		/// Возникает в случае прогресса и прошедшего временного периода.
		/// </summary>
		public event System.EventHandler Progressed;
	
		#endregion
	}
}
atomicxp вне форума Ответить с цитированием
Старый 06.05.2009, 17:13   #4
Neymexa
Proffesional
Форумчанин
 
Аватар для Neymexa
 
Регистрация: 18.11.2008
Сообщений: 417
По умолчанию

спасибо .
У тебя все так сложно описано... будем разбираться
О, степь родимая, как я скучаю по тебе...
Neymexa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц