1

У меня это не-асинхронной задачи> которые только запросы:отменить TaskCompletionSource, который вызывает метод недействительным из API с таймаутом Xamarin форм

TaskCompletionSource<ObservableCollection<ItemDto>> tcs = new TaskCompletionSource<ObservableCollection<ItemDto>>(); 

     ObservableCollection<ItemDto> results = new ObservableCollection<ItemDto>(); 

     try 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(); 
      binding.OpenTimeout = new TimeSpan(0, 0, 30); 
      binding.CloseTimeout = new TimeSpan(0, 0, 30); 
      binding.SendTimeout = new TimeSpan(0, 0, 30); 
      binding.ReceiveTimeout = new TimeSpan(0, 0, 30); 

      MobileClient clientMobile = new MobileClient(binding, new EndpointAddress(_endpointUrl)); 

      clientMobile.FindItemsCompleted += (object sender, FindItemsCompletedEventArgs e) => 
      { 
       if (e.Error != null) 
       { 
        _error = e.Error.Message; 
        tcs.TrySetException(e.Error); 
       } 
       else if (e.Cancelled) 
       { 
        _error = "Cancelled"; 
        tcs.TrySetCanceled(); 
       } 

       if (string.IsNullOrWhiteSpace(_error) && e.Result.Count() > 0) 
       { 
        results = SetItemList(e.Result); 

        tcs.TrySetResult(results); 
       } 
       clientMobile.CloseAsync(); 
      }; 
      clientMobile.FindItemsAsync(SetSearchParam(searchString, 100)); 
     } 
     catch (Exception) 
     { 
      results = new ObservableCollection<ItemDto>(); 
      tcs.TrySetResult(results); 
     } 
     return tcs.Task; 

Да, я знаю, ничего особенного, это просто, что это

clientMobile.FindItemsAsync (SetSearchParam (SearchString, 100))

является вызов метода пустот, который, в свою очередь, вызывает другой метод, который недействительным устанавливает несколько параметров, чтобы затем вызвать метод async, который сам вызывает метод async, который выполняет операцию async для возврата списка элементов.

Проблема в том, что я не имею никакого контроля над чем-либо, выходящим за рамки этой задачи выше, потому что все, что я только что объяснил, является частью API, в котором мне не разрешено прикасаться, и я не могу комментарий, касающийся того, как это работает, поскольку политика заключается в том, чтобы я адаптировал свою работу к ней ... -_-

Чтобы это сделать, я должен убить этот вызов FindItemsAsync, как только прошло 1 минута ... Я пробовал устанавливать вышеуказанные интервалы времени на каждую минуту (сначала работал, теперь были внесены некоторые изменения и нет), я попытался уменьшить до половины времени, и не пошел ...

Код, вызывающий эту задачу:

public void LoadItemList(string searchString) 
    { 
     _itemList = new ObservableCollection<ItemDto>(); 

     // Calls the Task LoadList. 
     var result = LoadList(searchString).Result; 

     if (result != null && result != new ObservableCollection<ItemDto>()) 
     { 
      _itemList = result; 
     } 
     else 
     { 
      _isTaskCompleted = false; 
     } 

     _isListEmpty = (_itemList != new ObservableCollection<ItemDto>()) ? false : true; 
    } 

и ниже код, который вызывает абонента этой задачи ... (какой беспорядок -_-):

void Init(string searchString = "") 
    { 
     Device.BeginInvokeOnMainThread(async() => 
     { 
      if (!LoadingStackLayout.IsVisible && !LoadingActivityIndicator.IsRunning) 
      { 
       ToggleDisplayLoadingListView(true); 
      } 

      await Task.Run(() => _listVM.LoadItemList(searchString)); 

      ToggleDisplayLoadingListView(); 

      if (!string.IsNullOrWhiteSpace(_listVM.Error)) 
      { 
       await DisplayAlert("Error", _listVM.Error, "OK"); 
      } 
      else if (_listVM.AdList != null && !_listVM.IsListEmpty) 
      { 
       ItemListView.IsVisible = true; 

       ItemListView.ItemsSource = _listVM.ItemList; 
      } 
      else if (!_listVM.IsTaskCompleted || _listVM.IsListEmpty) 
      { 
       await DisplayAlert("", "At the moment it is not possible to show results for your search.", "OK"); 
      } 
      else if (_listVM.ItemList.Count == 0) 
      { 
       await DisplayAlert("", "At the moment there are no results for your search.", "OK"); 
      } 
     }); 
    } 

На данный момент я пытаюсь реализовать арку MVVM ...

действительно, спасибо вам за вашу помощь в этом вопросе, это было здорово, и я действительно приношу извинения за все неудобства ...

EDIT

Извините, потому что я не ясно объяснил свою цель; это: мне нужно получить список элементов, обращающихся к API, который просто связывается со мной через метод void FindItemsAsync. У меня есть 60 секунд, чтобы получить все эти предметы. Если что-то пойдет не так, или если время ожидания, я должен отменить процесс и сообщить пользователю, что что-то пошло не так.

Этого не происходит. Он никогда не отменяет. Либо я получаю предметы, либо остаюсь навсегда, расскажу о своих самых сложных попытках ... Я новичок в задачах и многом из этого, поэтому мои постоянные проблемы ...

ответ

2

Вы можете позвонить CloseAsync, когда истекает срок действия маркера отмены ,

//Creates an object which cancels itself after 5000 ms 
var cancel = new CancellationTokenSource(5000); 

//Give "cancel.Token" as a submethod parameter 
public void SomeMethod(CancellationToken cancelToken) 
{ 
    ... 

    //Then use the CancellationToken to force close the connection once you created it 
    cancelToken.Register(()=> clientMobile.CloseAsync()); 
} 

Это сократит соединение.

+0

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

+0

Вы использовали TaskCompletionSource, поэтому вы также должны знать об CancellationToken. – Softlion

+0

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