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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2014, 12:30   #21
ShadowInject
Пользователь
 
Регистрация: 08.11.2014
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Может все-таки попробуете почитать ошибки, а не убегать в ужасе от них? Это помогает, правда!
Вот этим сейчас и занимаюсь сижу у мекломягких, Как для меня очень тяжело что-то найти ) Могли бы вы помочь сделать эту отправку в отдельном потоке ? Я как начинающий еще далек от них
ShadowInject вне форума Ответить с цитированием
Старый 11.11.2014, 18:09   #22
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Чтобы прочитать ошибку не надо никуда лезть.

Цитата:
Могли бы вы помочь сделать эту отправку в отдельном потоке ?
"Помочь" — это когда попытаться сделать самостоятельно и задать конкретные вопросы (желательно после гугления).
А это называется "сделайте за меня".

Код:
using System.Threading;
using System.Threading.Tasks;

        /// <summary>
        /// Для синхронизации с UI потоком
        /// </summary>
        private SynchronizationContext UiSynchronizationContext;

        private void btnSend_Click(object sender, EventArgs e)
        {
            List<string> contacts = new List<string>();
            foreach (ListViewItem item in lstContacts.Items)
            {
                contacts.Add(item.Text);
            }

            string message = tboxMessage.Text;

            UiSynchronizationContext = SynchronizationContext.Current;

            btnSend.Enabled = false;

            Task task = Task.Factory.StartNew(() =>
            {
                Spam(contacts, message);
            });

            // после завершения потока
            task.ContinueWith(t =>
            {
                if (t.Status == TaskStatus.Faulted && t.Exception != null)
                {
                    MessageBox.Show("Ошибка: " + t.Exception.InnerExceptions[0].Message);
                }

                btnSend.Enabled = true;

                MessageBox.Show("Завершено.");
            }, TaskScheduler.FromCurrentSynchronizationContext());
        }

        /// <summary>
        /// Спамануть сообщение контактам
        /// </summary>
        /// <param name="contacts">Список с именами контактов</param>
        /// <param name="message">Текст спам-сообщения</param>
        private void Spam(List<string> contacts, string message)
        {
            foreach (var contact in contacts)
            {
                try
                {
                    skype.SendMessage(contact, message);
                }
                catch (Exception ex)
                {
                    InvokeOnUiThread(() =>
                    {
                        MessageBox.Show(String.Format("Ошибка при отправке сообщения контакту {0}: {1} ",
                            contact, ex.Message));
                    });
                }
            }
        }
        
        /// <summary>
        /// Выполнить метод в UI потоке
        /// </summary>
        // вообще для обновления прогресса и т.п. в UI лучше использовать IProgress<T>,
        // но мне чот влом, и в .NET 4.0 для него (и async/await) еще надо подключать библиотеку http://www.nuget.org/packages/Microsoft.Bcl.Async
        private void InvokeOnUiThread(Action action)
        {
            UiSynchronizationContext.Send(s => action(), null);
        }
http://www.codeproject.com/Articles/...l-Library-of-n
http://msdn.microsoft.com/en-us/libr...vs.100%29.aspx
https://richnewman.wordpress.com/tag...allel-library/
http://programmersforum.ru/showthread.php?t=267730
http://programmersforum.ru/showthread.php?t=267753
http://programmersforum.ru/showthread.php?t=266713
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 11.11.2014 в 18:15.
Alex11223 вне форума Ответить с цитированием
Старый 16.11.2014, 20:14   #23
ShadowInject
Пользователь
 
Регистрация: 08.11.2014
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Чтобы прочитать ошибку не надо никуда лезть.


"Помочь" — это когда попытаться сделать самостоятельно и задать конкретные вопросы (желательно после гугления).
А это называется "сделайте за меня".

Код:
using System.Threading;
using System.Threading.Tasks;

        /// <summary>
        /// Для синхронизации с UI потоком
        /// </summary>
        private SynchronizationContext UiSynchronizationContext;

        private void btnSend_Click(object sender, EventArgs e)
        {
            List<string> contacts = new List<string>();
            foreach (ListViewItem item in lstContacts.Items)
            {
                contacts.Add(item.Text);
            }

            string message = tboxMessage.Text;

            UiSynchronizationContext = SynchronizationContext.Current;

            btnSend.Enabled = false;

            Task task = Task.Factory.StartNew(() =>
            {
                Spam(contacts, message);
            });

            // после завершения потока
            task.ContinueWith(t =>
            {
                if (t.Status == TaskStatus.Faulted && t.Exception != null)
                {
                    MessageBox.Show("Ошибка: " + t.Exception.InnerExceptions[0].Message);
                }

                btnSend.Enabled = true;

                MessageBox.Show("Завершено.");
            }, TaskScheduler.FromCurrentSynchronizationContext());
        }

        /// <summary>
        /// Спамануть сообщение контактам
        /// </summary>
        /// <param name="contacts">Список с именами контактов</param>
        /// <param name="message">Текст спам-сообщения</param>
        private void Spam(List<string> contacts, string message)
        {
            foreach (var contact in contacts)
            {
                try
                {
                    skype.SendMessage(contact, message);
                }
                catch (Exception ex)
                {
                    InvokeOnUiThread(() =>
                    {
                        MessageBox.Show(String.Format("Ошибка при отправке сообщения контакту {0}: {1} ",
                            contact, ex.Message));
                    });
                }
            }
        }
        
        /// <summary>
        /// Выполнить метод в UI потоке
        /// </summary>
        // вообще для обновления прогресса и т.п. в UI лучше использовать IProgress<T>,
        // но мне чот влом, и в .NET 4.0 для него (и async/await) еще надо подключать библиотеку http://www.nuget.org/packages/Microsoft.Bcl.Async
        private void InvokeOnUiThread(Action action)
        {
            UiSynchronizationContext.Send(s => action(), null);
        }
http://www.codeproject.com/Articles/...l-Library-of-n
http://msdn.microsoft.com/en-us/libr...vs.100%29.aspx
https://richnewman.wordpress.com/tag...allel-library/
http://programmersforum.ru/showthread.php?t=267730
http://programmersforum.ru/showthread.php?t=267753
http://programmersforum.ru/showthread.php?t=266713
Спасибо огромное ))
ShadowInject вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить сообщения\отправить. Небожитель C/C++ Сетевое программирование 1 23.05.2014 08:23
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
[C# + WPF] ListView. Узнать выделена ли строка в нём. ListView.View == GridView. Casper-SC WPF, UWP, WinRT, XAML 2 12.08.2010 19:04
Поиск по списку androidvsu Общие вопросы по Java, Java SE, Kotlin 4 14.06.2010 18:43
как отправить сообщения на Асю (icq) Ermak Работа с сетью в Delphi 8 19.09.2007 19:57