1

我有這個非異步任務>剛剛要求:取消taskcompletionsource從一個API調用一個void方法與超時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))

是空隙的方法,後者又調用另一空隙方法的調用,其設置一些參數,然後調用一個異步方法,它自己調用異步方法執行異步操作以返回項目列表。

問題是,我無法控制任何超出上述任務範圍的任何內容,因爲我剛剛解釋的所有內容都是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拱...

真的,非常感謝你對你在這個問題上的幫助,這是偉大的,我真的很爲這一切的不便表示歉意......

編輯

對不起,因爲我沒有清楚地解釋我的目標;它是:我需要獲取一個訪問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的結果,並且因爲我沒有使用任何異步/等待的東西,我在收到結果之前完成了被調用的方法,因此實現了我找到的這個解決方案... –

相關問題