Я пишу программу для тестирования производительности службы WCF в условиях высокого параллелизма.
На стороне клиента я запускаю множество потоков для вызова сервисной функции WCF, которая возвращает длинный список объекта данных.
На стороне сервера, в этой функции, вызываемой моим клиентом, мне нужно знать количество клиентов, вызывающих функцию.
Для этого я установил переменную-счетчик. В начале функции я добавляю счетчик на 1, но как я могу уменьшить его после того, как функция вернула результат ?
int clientCount=0;
public DataObject[] GetData()
{
Interlocked.Increment(ref clientCount);
List<DataObject> result = MockDb.GetData();
return result.ToArray();
Interlocked.Decrement(ref clientCount); //can't run to here...
}
Я видел путь в C ++.
Создайте новый класс с именем counter.
В конструкторе класса counter увеличьте переменную.
И уменьшить его в деструкторе.
В функции создайте объект-счетчик, чтобы вызывался его конструктор.
А после возврата функции будет вызван ее деструктор.
Как это:
class counter
{
public:
counter(){++clientCount; /* not simply like this, need to be atomic*/}
~counter(){--clientCount; /* not simply like this, need to be atomic*/}
};
...
myfunction()
{
counter c;
//do something
return something;
}
В c # я думаю, что могу сделать это со следующими кодами, но не точно.
public class Service1 : IService1
{
static int clientCount = 0;
private class ClientCounter : IDisposable
{
public ClientCounter()
{
Interlocked.Increment(ref clientCount);
}
public void Dispose()
{
Interlocked.Decrement(ref clientCount);
}
}
public DataObject[] GetData()
{
using (ClientCounter counter = new ClientCounter())
{
List<DataObject> result = MockDb.GetData();
return result.ToArray();
}
}
}
я пишу класс счетчика, реализующий интерфейс IDisposable .
И поместите мои коды функций в , используя блок .
Но похоже, что это не так хорошо работает.
Независимо от того, сколько потоков я запускаю, переменная clientCount намного меньше номера потока.
Буду признателен за любой совет.