Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:

internal IMessage _replyMsg

В случае синхронного вызова результат отправляется вызывающей стороне опять же в форме сообщения. Данное поле будет хранить ссылку на это сообщение по завершении вызова.

internal Context _ctx

Домен синхронизации может состоять из нескольких контекстов, и только один из них содержит свойство синхронизации данного домена. С каждым контекстом связана своя цепочка перехватчиков. В каждой такой цепочке имеется перехватчик, ассоциированный со свойством синхронизации. Вызов, перемещающийся

по некоторой цепочке перехватчиков в некоторый контекст, прерывает свое путешествие в перехватчике, ассоциированном со свойством синхронизации, и отправляется в очередь вызовов в виде работы — экземпляра класса WorkItеm. Эта очередь поддерживается в свойстве синхронизации данного домена, которое может размещаться совсем не в том контексте, куда первоначально направлялся вызов. Поле _ctx используется для хранения информации о первоначальном контексте, в котором должен выполняться данный вызов после его освобождения из очереди.

internal LogicalCallContext _callCtx

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

Немного про асинхронные вызовы

При разборе кода атрибута синхронизации нам придется часто упоминать такое понятие как асинхронный вызов. Уместно сделать отступление и разобрать код, демонстрирующий работу с асинхронными вызовами.

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

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

При использовании асинхронных вызовов клиент может вызывать методы сервера параллельно и в процессе ожидания выполнять дополнительную работу.

В данном случае услуги, предоставляемые сервером, сводятся к выполнению двух арифметических операций (сложение и умножение на 2). Работа, которую клиент выполняет в ожидании ответов от сервера, состоит в выводе на консоль отметок о завершении очередного 100 mс временного интервала.

using System;

using System.Threading;

using System.Runtime.Remoting;

public class Server {

public static bool Sum(int x, int y, out int z) {

Console.WriteLine(

"Server (Sum method) thread = " +

Thread.CurrentThread.GetHashCode+

"; PoolThread = "+

Thread.CurrentThread.IsThreadPoolThread);

Thread.Sleep(1000);

z = 0;

try {

z = checked((int)(x + y));

}

catch (Exception) {

return false;

}

return true;

}

public static bool MultBy2(int x, out int y) {

Console.WriteLine {

"Server (MultBy2 method) thread = " +

Thread.CurrentThread.GetHasheode+

"; PoolThread = "+

Thread.CurrentThread.IsThreadPoolThread);

Thread.Sleep(1000);

y = 0;

try {

у = checked((int) (x*2));

}

catch (Exception) {

return false;

}

return true;

}

}

Public class Client {

private static int workCount = 0;

private delegate bool HardFunction2Args (

int x, int y, out int result);

private delegate bool HardFunctionlArg (

int x, out int result);

private static void SumCallback(IAsyncResult ar) {

int z;

HardFunction2Args sum =

(HardFunction2Args)ar.AsyncState;

bool result = sum.Endlnvoke(out z, ar);

if (result) Console.WriteLine (

"SumCallback: Sum = " + z);

else Console.WriteLine (

"SumCallback: Bad arguments for Server.Sum

workCount++;

}

private static void MultCallback(IAsyncResult ar) {

int z;

HardFunctionlArg mult =

(HardFunctionlArg)ar.AsyncState;

bool result = mult.Endlnvoke(out z, ar);

if (result) Console.WriteLine (

"MultCallback: MultBy2 = " + z);

else Console.WriteLine (

"MultCallback: Bad argument for MultBy2");

workCount++;

}

public static void Main {

int sumResult, multResult, count = 0;

Console.WriteLine("Client thread = " +

Thread.CurrentThread.GetHashCode + PoolThread = "+

Thread.CurrentThread.IsThreadPoolThread);

HardFunction2Args sum =

new HardFunction2Args(Server.Sum);

HardFunctionlArg mult =

new HardFunctionlArg(Server.MultBy2);

AsyncCallback sumCallback =

new AsyncCallback(SumCallback);

AsyncCallback multCallback =

new AsyncCallback(MultCallback);

IAsyncResult arSum = sum.Beginlnvoke(3, 4,

out sumResult, sumCallback, sum);

IAsyncResult arMult = mult.Beginlnvoke(5,

out multResult, multCallback, mult);

while (workCount < 2) {

Console.WriteLine("Client thread: count = "+ count++);

Thread.Sleep(100);

}

Console.WriteLine("Bye!");

Поделиться:
Популярные книги

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

Новый Рал 8

Северный Лис
8. Рал!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Новый Рал 8

Барон Дубов 2

Карелин Сергей Витальевич
2. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 2

Девочка для Генерала. Книга первая

Кистяева Марина
1. Любовь сильных мира сего
Любовные романы:
остросюжетные любовные романы
эро литература
4.67
рейтинг книги
Девочка для Генерала. Книга первая

Случайная жена для лорда Дракона

Волконская Оксана
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Случайная жена для лорда Дракона

Вампиры девичьих грез. Тетралогия. Город над бездной

Борисова Алина Александровна
Вампиры девичьих грез
Фантастика:
фэнтези
6.60
рейтинг книги
Вампиры девичьих грез. Тетралогия. Город над бездной

Демон

Парсиев Дмитрий
2. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Демон

Темный Лекарь 7

Токсик Саша
7. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.75
рейтинг книги
Темный Лекарь 7

Вспомнить всё (сборник)

Дик Филип Киндред
Фантастика:
научная фантастика
6.00
рейтинг книги
Вспомнить всё (сборник)

Сумеречный Стрелок 10

Карелин Сергей Витальевич
10. Сумеречный стрелок
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Сумеречный Стрелок 10

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Никита Хрущев. Рождение сверхдержавы

Хрущев Сергей
2. Трилогия об отце
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Никита Хрущев. Рождение сверхдержавы

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Дворянская кровь

Седой Василий
1. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Дворянская кровь