Многопоточная синхронизация с использованием блокировки широкого диапазона с обратными вызовами WCF - PullRequest
0 голосов
/ 18 января 2012

То, что я хочу сделать, это--

Я хочу сделать прокси-вызов для службы и получить данные в отдельном потоке с помощью асинхронного обратного вызова ... Сложность состоит в том, что я хочу, чтобы поток переднего плана спал, пока не будут получены все данные.

Причина, по которой я не использую синхронный метод для этого, заключается в том, что я создаю API для службы WCF, которая использует пейджинг и возвращает данные кусками.
Я хочу, чтобы мой клиент мог использовать пейджинг, но я не хочу показывать все мои обратные вызовы пейджинга моему API ... Я хочу, чтобы это выглядело так, как будто API предоставляет синхронный метод извлечения данных.

Я пытался использовать закрытый статический семафор (потому что он не зависит от потоков), который доступен для методов класса и обратных вызовов, с возможностью использования одной единицы в качестве средства для приостановки выполнения.

Сначала я использую оператор Semaphore.WaitOne ().
Затем я выполняю прокси-вызов в потоке переднего плана, и служба создает поток, который обрабатывает извлечение данных, и управление передается обратно клиенту.
В клиенте я немедленно использую второй оператор Semaphore.WaitOne (). Это должно приостановить выполнение потока переднего плана, что он и делает. Затем, после выполнения обратного вызова «Paging Completed» в отдельном потоке, я использую Semaphore.Release () Но поток переднего плана никогда не пересекает второй оператор Semaphore, он остается заблокированным и клиент останавливается.

Есть идеи, что я делаю неправильно, или есть другой дизайн блокировки, который был бы более эффективным?

1 Ответ

1 голос
/ 18 января 2012

Если вы пытаетесь добиться того, чтобы поток переднего плана ждал потока сбора данных, вы можете рассмотреть возможность использования Задач, которые позволят вам легко выполнить то, что вы описали здесь.

System.Threading.Tasks: http://msdn.microsoft.com/en-us/library/dd235608.aspx

Некоторые коды:

Task t = new Task(somethingToDo);
// Fire off the new task
t.Start();

// Wait for the task to finish...
t.Wait();

// Do something else...

Обязательно ознакомьтесь с подробной информацией о t.Wait () в документации. Есть некоторые исключения, к которым вы захотите быть готовыми в случае сбоя вашей задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...