powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
5 сообщений из 5, страница 1 из 1
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
    #39011959
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал это https://msdn.microsoft.com/en-us/library/ms731193.aspx
и не понял, как мне сделать, чтобы, с одного клиента метод, скажем, AddData можно было вызвать только синхронно, а два разных метода этого же сервиса (скажем, AddData и GetData) - можно асинхронно?

Т. е. вызвал AddData и нельзя его снова вызвать, пока первый вызов не отработал. Даже в параллельном потоке клиента. А вот другой метод сервиса - GetData - чтобы можно было вызвать, даже если на сервисе пока не окончил работу метод AddData.
...
Рейтинг: 0 / 0
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
    #39012038
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне тут подсказывают на SO, что раздельного поведения для двух разных методов одной службы добиться... трудно, чтоли. Если вообще возможно. Предлагают сделать два сервиса - один принимает данные, другой - отдаёт.

Непонятно только, как сделать доступ из двух работающих служб к одним данным. При этом штука в том, что службы работает в режиме "один инстанс на сессию" - т. е. надо как-то создать по экземпляру каждой службы, расшарить между ними сессионные данные (чтобы они считали, что это один и тот же пользователь залогинился). А потом ещё где-то хранить данные, которые нужно отдавать второй службой (но которые должна наполнять первая служба) - где-то в третьем потоке? Блин, не слишком ли сложно для простой задачи "отдаю и читаю данные асинхронно"?
...
Рейтинг: 0 / 0
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
    #39012062
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот я создал тестовые приложения

сервис

Код: 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.
[ServiceContract]
public interface IService1
{
	[OperationContract]
	void AddData(IEnumerable<double> values);

	[OperationContract]
	double GetData();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
	Queue<double> _q = new Queue<double>();

	public void AddData(IEnumerable<double> values)
	{
		foreach (var val in values)
		{
			_q.Enqueue(val);
			Thread.Sleep(500);
		}
	}

	public double GetData()
	{
		return _q.Dequeue();
	}
}




клиент

Код: 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.
class Program
{
	static double[] v1 = new double[] { 1, 11, 111, 1111 };
	static double[] v2 = new double[] { 2, 22, 222, 2222 };
	static double[] v3 = new double[] { 3, 33, 333, 3333 };

	static void Main(string[] args)
	{
		Service1Client client = new Service1Client();


		new Thread(
			new ThreadStart(
				() =>
				{
					client.AddData(v1);
					client.AddData(v2);
					client.AddData(v3);
				}))
			.Start();

		new Thread(
			new ThreadStart(
				() =>
				{
					while (true)
					{
						Thread.Sleep(200);
						Console.WriteLine(client.GetData());
					}
				}))
			.Start();
	}
}



Результат вывода клиента:

ждёт 2 секунды
выводит 1
ждёт 2 секунды
выводит 11
ждёт 2 секунды
выводит 111
затем примерно каждые полсекунды выводит всё остальное - т. е. 1111, 2, 22 и т. д.

Как я это объясняю: сервис отработал синхронно, несмотря на то, что у него стояла настройка ConcurrencyMode.Multiple и клиент тоже работал многопоточно. Т. е. сначала клиент в первом потоке вызвал метод AddData сервиса и сервис добавлял четыре элемента по полсекунды - это и есть первая задержка в 2 секунды в выводе клиента. Затем второй поток клиента достучался до сервиса и выдал первый элемент из очереди. Затем первый поток снова добавлял данные 2 секунды в сервис, потом снова второй поток клиента достал очередное данное из очереди. И так, пока первый поток не добавил все данные в сервис, второй постоянно ждал его. Ну а потом работу продолжил один второй поток на клиенте.

Так почему же не получилось поработать на сервисе многопоточно?
...
Рейтинг: 0 / 0
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
    #39012072
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче говоря, как я понял, нужно заставить работать службу в фулл дуплексе , а по умолчанию она работает в полудуплексе, сколько ей ConcurrencyMode.Multiple не выставляй.

Т. е. мне-то надо в моём примере, чтобы забор данных был не медленнее, чем они добавляются - т. е. как только добавил новое данное с помощью AddData в одном потоке, второй поток клиента должен его забрать с помощью GetData.
...
Рейтинг: 0 / 0
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
    #39018997
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey2112,

Можете попробовать создать "синхронность" самостоятельно. Пусть все методы будут асинхронными, а в нужном организуйте доступ через критическую секцию.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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