powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потоки
9 сообщений из 9, страница 1 из 1
Потоки
    #39078650
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
есть программа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Button b = new Button();
            b.Click += b_Click;
            this.Controls.AddRange(new Control[] { b, new TextBox() { Name = "EventText", Location = new Point(0, 30) } });
        }

        void b_Click(object sender, EventArgs e)
        {
            Class1 c1 = new Class1();
            c1.Success += c1_Success;
            c1.Start();
        }

        private void c1_Success(object sender, MyEvent e)
        {
            TextBox t = this.Controls["EventText"] as TextBox;
            if (t != null)
                this.Invoke(new Action(() => { t.Text = e.RetData; }));
        }
    }

    public class Class1
    {
        public EventHandler<MyEvent> Success;

        public void Start()
        {
            Task t = Task.Factory.StartNew(() => foo());
        }

        private void foo()
        {
            OnSuccess(new MyEvent());
        }

        public void OnSuccess(MyEvent e)
        {
            var ret = Success;
            if (ret != null)
            {
                ret(this, e);
            }
        }
    }

    public class MyEvent : EventArgs
    {
        public string RetData = "Success!";
    }
}




как можно переписать метод:
Код: c#
1.
2.
3.
4.
private void foo()
{
     OnSuccess(new MyEvent());
}


чтобы при перехвате вызова события в методе private void c1_Success(object sender, MyEvent e) не требовалось писать так:
Код: c#
1.
this.Invoke(new Action(() => { t.Text = e.RetData; }));


а можно было бы просто сделать присвоение:
Код: c#
1.
t.Text = e.RetData;



т.е. вызвать событие в потоке, в котором создан класс Class1

спасибо.
...
Рейтинг: 0 / 0
Потоки
    #39078655
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
this.Invoke(new Action(() => { t.Text = e.RetData; }));

:) хотел выделить жирным данную строку...
...
Рейтинг: 0 / 0
Потоки
    #39078671
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Task инициируется в UI-потоке, то можно указать ContinueWith с параметром TaskScheduler.FromCurrentSynchronizationContext()

Код: c#
1.
2.
Task.Factory.StartNew(() => { Foo(); })
                .ContinueWith(v => Foo2(), TaskScheduler.FromCurrentSynchronizationContext());
...
Рейтинг: 0 / 0
Потоки
    #39078708
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris,
не-а, не осилил идею...

ContinueWith:
Создает продолжение, которое выполняется асинхронно после завершения выполнения целевой задачи Task.

целевая задача запускается в отдельном классе... в идеале моя задача передать данные из асинхронного метода не UI-
сборки в UI-интерфейс...
...
Рейтинг: 0 / 0
Потоки
    #39078726
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WitCPallaris,
не-а, не осилил идею...

А чо так слабо? Твой ContinueWith-Task запустится в UI-потоке благодаря TaskScheduler.FromCurrentSynchronizationContext() (его правда нужно объявить в UI-потоке)
...
Рейтинг: 0 / 0
Потоки
    #39078749
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
WitC,

[ SRC c#]>>>this.Invoke<<<(new Action(() => { t.Text = e.RetData; }));[/SRC ]

Убрать пробелы в тегах

Код: c#
1.
this.Invoke(new Action(() => { t.Text = e.RetData; }));
...
Рейтинг: 0 / 0
Потоки
    #39078757
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,
ок, а по существу???
...
Рейтинг: 0 / 0
Потоки
    #39078975
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WitC,

вам уже ответили, используйте контекст синхронизации с главным потоком STA потоком
...
Рейтинг: 0 / 0
Потоки
    #39079047
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
WitCCat2,
ок, а по существу???
Я просто хотел помочь Вам оформлять сообщения.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потоки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]