WCF с именованными каналами и WPF — тайм-аут с трудоемкими операциямиC#

Место общения программистов C#
Anonymous
WCF с именованными каналами и WPF — тайм-аут с трудоемкими операциями

Сообщение Anonymous »

Я борюсь с проектом, который копирует файлы из сети (общий ресурс CIFS).
IPC, который я использую, — это именованные сетевые каналы с дуплексным каналом, а для графического интерфейса я использую WPF. p>
Приложение обменивается данными только между службой и пользовательским интерфейсом на одном компьютере.
Проблема сбивает с толку, поскольку я подготовил несколько трудоемких методов, таких как копируя целые каталоги из общего ресурса CIFS на клиента, и во время копирования я много раз сталкивался с такой проблемой:

System.TimeoutException: 'This Операция запроса, отправленная на net.pipe://localhost/service, не получила ответа в течение настроенного времени ожидания (00:01:00). Время, отведенное для этой операции, могло быть частью более длительного тайм-аута. Это может быть связано с тем, что служба все еще обрабатывает операцию или потому, что службе не удалось отправить ответное сообщение. Рассмотрите возможность увеличения тайм-аута операции (путем приведения канала/прокси к IContextChannel и установки свойства OperationTimeout) и убедитесь, что служба может подключиться к клиенту.'

Я искал решение и обнаружил, что время ожидания можно увеличить, но мою проблему это не решило.
Для небольших каталогов можно увеличить время ожидания например 3-4 минуты, но для больших, которые могут весить более 1 ГБ, это может стать большой проблемой.
Независимые действия также будут выполняться в фоновом режиме, например проверка каждые несколько минут на наличие определенный общий ресурс CIFS отвечает или регистрирует статус приложения независимо от того, что происходит в данный момент (я имею в виду действия пользователя). Я использую асинхронность, среди прочего, с помощью Tasks, но не уверен, что она хорошо работает с именованными каналами.
Я даже подготовил интерфейс обратного вызова, который возвращает ход копирования, думая, что это могло бы помочь «удержать» таймаут, но это не помогло.
Сейчас я в тупике, потому что начал тестировать это решение с помощью Сервиса, отдельного от графического интерфейса, который содержит всю логику приложения. Есть ли у кого-нибудь идеи, что я мог бы изменить или, возможно, какую технологию использовать для поддержания идеи разделения и подобного общения? Разделение этих двух процессов вызвано разницей в правах пользователей.

@Edit
Есть два интерфейсы, которые я использую:

Код: Выделить всё

    [ServiceContract(CallbackContract = typeof(ICopierCallbackService))]
public interface ICopierService
{
[OperationContract]
[ServiceKnownType(typeof(PackagePart))]
Task CheckPackages();
}

[ServiceContract]
public interface ICopierCallbackService
{
[OperationContract(IsOneWay = true)]
void GetTime(string time);

[OperationContract(IsOneWay = true)]
void ReportCopyProgress(string source, string destination, int progress);
}
Я создал дополнительный класс, связанный с этим копированием (CopyProgressEventArgs), который реализует EventArgs, что позволяет передавать более двух параметров в отличие от типичного использования «Invoke».
Это мой «ServiceClient»:

Код: Выделить всё

public class ServiceClient : ICopierCallbackService
{
private ICopierService _serviceProxy;
private DuplexChannelFactory _duplexChannelFactory;
private const string NamedPipeAddress = "net.pipe://localhost/service";
public event EventHandler CopyProgressChanged;

public ServiceClient()
{
_duplexChannelFactory = new DuplexChannelFactory(this, new NetNamedPipeBinding(), new EndpointAddress(NamedPipeAddress));
_serviceProxy = _duplexChannelFactory.CreateChannel();
}

public async Task CheckPackages()
{
List packages = await _serviceProxy.CheckPackages();

return packages;
}

public void ReportCopyProgress(string source, string destination, int progress)
{
CopyProgressChanged?.Invoke(this, new CopyProgressEventArgs(source, destination, progress));
}
}
И, наконец, во ViewModel я подготовил свойство для отслеживания того, изменился ли прогресс, и в настоящее время его печать с помощью System.Diagnostics.Debug.Writeline дает мне действительный вывод на консоль.


Подробнее здесь: https://stackoverflow.com/questions/788 ... operations

Вернуться в «C#»