WCF вызывать функцию, не дожидаясь ее завершения?
На стороне клиента каждый раз, когда я вызываю функцию из моей службы WCF, она ожидает завершения функции в службе WCF, как, например, вызов локальной функции. Поэтому я добавил дополнительную функцию для каждой, которая запускает намеченную функцию в новом потоке, так что почти все мои функции выглядят так:
EX:
Я вызываю функцию со стороны КЛИЕНТА client.ReceiveFile()
:
private void SendFile(Socket socket, Job job, DoWorkEventArgs e)
{
UpdateInfo(job.Name, job.Icon, job.Size);
client.ReceiveFile((_File)job.Argument, bufferSize);
SizeAll = job.Size;
UpdateCurrFile(((_File)job.Argument).Path, "1");
SendX(socket, ((_File)job.Argument).Path, e);
}
На сервере я должен сделать это следующим образом:
public void ReceiveFile(_File file, int bufferSize)
{
System.Threading.Thread th = new System.Threading.Thread(unused => ReceiveFileTh(client, file.Name, file.Size, bufferSize));
th.Start();
}
private void ReceiveFileTh(Socket client, string destPath, long size, int bufferSize)
{
try
{
ReceiveX(client, destPath, size, bufferSize);
}
finally
{
CloseClient();
}
}
Дело в том, что когда я отправляю файл с клиента, он сообщает службе начать прием, но если я не запустил новый поток, клиент будет ждать, пока служба примет файл, и не отправит данные файла.
Так что WCF поддерживает способ, который не заставляет клиента ждать выполнения сервисной функции! или мне придется использовать вышеуказанный метод?
2 ответа
Что вы ищете [OperationContract(IsOneWay = true)]
Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/magazine/cc163537.aspx
Инструменты генерации клиентского кода.NET имеют встроенную поддержку для этого - вам не нужно вручную генерировать асинхронные версии каждого метода.
Если вы используете Add Service Reference в Visual Studio, отметьте в диалоговом окне вверху: есть флажок " Создать асинхронные операции". Если вы используете svcutil.exe, используйте параметр /async для генерации асинхронных клиентских методов.