我有這個非異步任務>剛剛要求:取消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秒鐘來獲取所有這些物品。如果出現問題或超時,我必須取消流程並通知用戶出現問題。
這沒有發生。它永遠不會取消。要麼讓我的項目,或永遠保持加載,儘管我最難的嘗試...我是新任務和大部分這些東西,因此我的問題不斷...
看到問題是我沒有取消令牌,甚至不知道如何使用一個...我擁有的只是壓力,而對某些東西的要求永遠不夠...你會介意多解釋一下關於我如何使用這個取消標記,或者如果這是什麼從這個等式中缺少,請? –
您使用了TaskCompletionSource,因此您應該瞭解CancellationToken。 – Softlion
對不起,我知道它的存在,但不知道如何使用它,並且主要是從MSDN示例中複製這些代碼,因爲那時我試圖等待API的結果,並且因爲我沒有使用任何異步/等待的東西,我在收到結果之前完成了被調用的方法,因此實現了我找到的這個解決方案... –