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 для генерации асинхронных клиентских методов.

Другие вопросы по тегам