Может каждый указывать поток, на котором AsyncCallback работает при использовании делегата. BeginInvoke?

От моего понимания.NET, если я использую BackgroundWorker и имею обработчик событий для RunWorkerCompleted, обработчик событий будет работать на том же потоке, в котором назвали RunWorkerAsync. Если вместо этого я использую BeginInvoke на делегате, чтобы выполнить метод асинхронно и передать параметр AsyncCallback BeginInvoke, там какой-либо способ, которым я могу указать, что обратный вызов работает на том же потоке который названный BeginInvoke - или в этом отношении произвольном потоке? От моего понимания обратного вызова работает на следующем доступном потоке от пула потоков. Это прекрасно, но является там способом, которым я могу выполнить код в AsyncCallback на потоке, который я хочу? Я действительно знаю, что можно использовать BeginInvoke на форме или управлять и заставить код в рамках обратного вызова работать на потоке, который создал элемент UI. Но что относительно того, если я хочу выполнить код потока неUI без форм или средств управления?

8
задан YWE 15 February 2010 в 04:27
поделиться

4 ответа

В потоке, который вы хотите использовать в качестве цели для асинхронной операции, свойство CurrentDispatcher является объектом System.Threading.Dispatcher который можно использовать для принудительного выполнения обратного вызова в этом потоке.

Это базовый класс, который класс Control использует для реализации BeginInvoke.

Возникли вопросы об использовании этого с формами Windows. Я не думаю, что это будет проблемой, хотя, если у вас есть форма, лучше выбрать form.BeginInvoke. Похоже, что и форма, и WPF используют один и тот же базовый класс для обработки вызова. http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx

6
ответ дан 5 December 2019 в 15:23
поделиться

Ознакомьтесь с главой 9 по упаковке приложений OSGi/Equinox в новой книге OSGi и Equinox. Он доступен на черновых погонах: http://my.safaribooksonline.com/9780321561510 . Он должен быть доступен в печати для покупки EclipseCon в марте.

-121--4043389-

Обычно я использую что-то вроде:

if (str == "") {
     //Do Something
}
else {
     //Do Something Else
}
-121--1894486-

Я выполнил поиск и оказался на сайте Джона Скита . Это очень информативное описание работы многопоточности с асинхронными делегатами и обратными вызовами. Я бы очень рекомендовал это читать.

0
ответ дан 5 December 2019 в 15:23
поделиться

Delegate.BeginInvoke всегда будет выполнять делегат в ThreadPool, а AsyncCallback вызывается в том же потоке, который выполнял делегат.

Ваш единственный выбор - повторно вызвать обратный вызов в вашем конкретном потоке:

AsyncCallback = delegate (IAsyncResult ar)
{
    wathever.BeginInvoke(delegate
    {
        // Do your stuff...
    };
};
5
ответ дан 5 December 2019 в 15:23
поделиться

Проблема методов расширения и интерфейсов заключается в том, что свойства зависимостей требуют объявления статических членов и общедоступных свойств, например:

    public PermissionEnum Permission
    {
        get { return (PermissionEnum)GetValue(PermissionProperty); }
        set { SetValue(PermissionProperty, value); }
    }

    public static readonly DependencyProperty PermissionProperty =
        DependencyProperty.Register("Permission", typeof(PermissionEnum), typeof(SecurityMenuItem), new FrameworkPropertyMetadata(PermissionEnum.DeliveryView));
-121--4905363-
int f(int n)
{
   static int x = 0;
   result = -x;
   x = n;
   return result;
}

Это одна запись FIFO с отрицанием. Конечно, это не работает для максимального отрицательного числа.

-121--1765774-

Поток всегда будет потоком пула потоков и никогда не будет потоком пользовательского интерфейса.

BTW, C # не имеет класса BackgroundWorker . .NET.

0
ответ дан 5 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: