От моего понимания.NET, если я использую BackgroundWorker и имею обработчик событий для RunWorkerCompleted, обработчик событий будет работать на том же потоке, в котором назвали RunWorkerAsync. Если вместо этого я использую BeginInvoke на делегате, чтобы выполнить метод асинхронно и передать параметр AsyncCallback BeginInvoke, там какой-либо способ, которым я могу указать, что обратный вызов работает на том же потоке который названный BeginInvoke - или в этом отношении произвольном потоке? От моего понимания обратного вызова работает на следующем доступном потоке от пула потоков. Это прекрасно, но является там способом, которым я могу выполнить код в AsyncCallback на потоке, который я хочу? Я действительно знаю, что можно использовать BeginInvoke на форме или управлять и заставить код в рамках обратного вызова работать на потоке, который создал элемент UI. Но что относительно того, если я хочу выполнить код потока неUI без форм или средств управления?
В потоке, который вы хотите использовать в качестве цели для асинхронной операции, свойство CurrentDispatcher является объектом System.Threading.Dispatcher который можно использовать для принудительного выполнения обратного вызова в этом потоке.
Это базовый класс, который класс Control использует для реализации BeginInvoke.
Возникли вопросы об использовании этого с формами Windows. Я не думаю, что это будет проблемой, хотя, если у вас есть форма, лучше выбрать form.BeginInvoke. Похоже, что и форма, и WPF используют один и тот же базовый класс для обработки вызова. http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx
Ознакомьтесь с главой 9 по упаковке приложений OSGi/Equinox в новой книге OSGi и Equinox. Он доступен на черновых погонах: http://my.safaribooksonline.com/9780321561510 . Он должен быть доступен в печати для покупки EclipseCon в марте.
-121--4043389-Обычно я использую что-то вроде:
if (str == "") {
//Do Something
}
else {
//Do Something Else
}
-121--1894486- Я выполнил поиск и оказался на сайте Джона Скита . Это очень информативное описание работы многопоточности с асинхронными делегатами и обратными вызовами. Я бы очень рекомендовал это читать.
Delegate.BeginInvoke всегда будет выполнять делегат в ThreadPool, а AsyncCallback вызывается в том же потоке, который выполнял делегат.
Ваш единственный выбор - повторно вызвать обратный вызов в вашем конкретном потоке:
AsyncCallback = delegate (IAsyncResult ar)
{
wathever.BeginInvoke(delegate
{
// Do your stuff...
};
};
Проблема методов расширения и интерфейсов заключается в том, что свойства зависимостей требуют объявления статических членов и общедоступных свойств, например:
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.