2012-04-26 4 views
6

На стороне клиента каждый раз, когда я вызываю функцию из моей службы 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(); 
     } 
    } 

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

Так что WCF поддерживает способ, который не заставит клиента ждать выполнения служебной функции! или мне придется использовать вышеуказанный метод?

ответ

15

то, что вы ищете, [OperationContract(IsOneWay = true)] подробнее см http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

+2

Да. Это правда. По умолчанию этот параметр является ложным, поэтому клиент будет ждать, пока функция будет выполнена. Если для него установлено значение true, это означает, что функция ничего не возвращает, и клиент не будет ждать ответа. – sleepwalker

+0

Извините, я забыл обновить услугу =), это сработало –

1

Утилиты для генерации кода кода .NET имеют встроенную поддержку этого - вам не нужно вручную генерировать асинхронные версии каждого метода.

Если вы используете Add Service Reference в Visual Studio, проверьте в диалоговом окне рядом с верхним: есть флажок, который говорит Генерировать асинхронные операции. Если вы используете svcutil.exe, используйте параметр /async для генерации асинхронных клиентских методов.

+1

это еще не самое лучшее, как вы только начинаете другой поток от клиента службы вместо службы. если вы действительно не заботитесь о том, чтобы ответ, обозначающий операцию как односторонний, - лучшее, что нужно сделать. –

+0

@ nathangonzalez хорошо, о чем говорит Op, это получение асинхронного обратного вызова. Если вы хотите, чтобы несколько экземпляров службы работали, то для этого нужны атрибуты * PerSession * и * PerCall *. – McGarnagle

+0

@dbaseman nope это не работает, мне по-прежнему нужна другая функция для возврата значений, на самом деле служба уже имеет атрибут PerSession '[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession)]. Натан Гонсалес был прав. –