Call api với cancellationToken xamarin forms

Mình đang xây dựng 1 thao tác gọi api với tham số cancellationToken.mình muốn hỏi là Làm sao để từ 1 event A mà mình đặt cancellationTokenSource.cancel() thì nó gửi đi kèm vs phương thức gọi api ở event B , hiện tại mình gọi cái cancel() từ event A thì khi bên Event B lúc đang gọi api sẽ bị bắt exception luôn, mà mình muốn cái exception này phải dk bắt bên api cơ
…help, mình đã mất 4 ngày search trên gg nhưng không được

Ờ… chưa hiểu vấn đề của bạn lắm, bạn có thể giải thích rõ hơn được không?

1 Like

Nó là như này ạ
mình có 1 api

public async Task<IActionResult> gettext(CancellationToken token)
    {
        string s = "S"; try
        {
            for (int i = 0; i < 10; i++)
            {
                s += "Number " + i;
                await Task.Delay(1000, token);
            }
            return Ok(s);

        }
        catch(TaskCanceledException ex)
        {
            return BadRequest("loi");
        }
       
    }

1 web hay app khác sẽ có 2 event bao gồm

private void EventA(object obj)
    {
        cts.Cancel();
    }

  private async void EventB(object obj)
    {
        cts = new CancellationTokenSource();
        TextValue = "Loading";
        var client = new RestClient("https://localhost:44333/api/cancel/gettext");
        client.Timeout = -1;
        var request = new RestRequest(Method.GET);
        IRestResponse response = await client.ExecuteGetTaskAsync(request,cts.Token);
        TextValue =  response.Content;
    }

bây h khi ban đầu Event B sẽ khởi động trước và bắt đầu gọi Api , trong lúc đó tầm 1-2 s sẽ kích hoạt Event A (do client) thì “cts” đính kèm trong phương thức gọi api sẽ nhận sự thay đổi của nó ở Event A và đưa nó sang API . Nhưng hiện tại cách này của mình làm thì khi Event A gọi xong thì ở Event B sẽ nhận Exception . mà cái Exception này mình muốn bên Api nhận và sử lý cơ ạ. nó là cơ chế hủy thao tác gọi api đó ạ

Theo mình hiểu mô hình của bạn là Client Server.

// Server
public async Task<IActionResult> gettext(CancellationToken token)
// Client
private void EventA(object obj);
private async void EventB(object obj)

Bạn muốn khi Client gửi request qua EventB, đồng thời Cancel request bằng Event A. Thì Server sẽ cancel thay vì client.

/*
Client                     <=>              Server
Event B -------------GET------------> getText(CancellationToken severToken)
delay(2s)
EventA 
clientToken.Cancel() ----X---------> severToken.Canceled = true; Expected

*/
// Server
catch(TaskCanceledException ex)
{
    return BadRequest("loi");
}

Nếu đúng như thế, thì bạn chưa hiểu về http rồi. nó là stateless, nghĩa là, nó chỉ nhận và xử lý 1 yêu cầu từ client và không lưu bất kỳ state nào của request đó.
Nói cách khác, khi client gửi request cancel về phía server, server sẽ xếp request cancel đó vào queue, đợi khi xử lý xong hết pending request khác mới xử lý cancel. (ngoài ra có trường hợp chạy đa luồng, song song, hoặc thậm chí xử lý trên nhiều instant khác nhau, các request đều được thực hiện độc lập)

3 Likes

Mình có đọc trên document của micr và thấy nó khi chạy vs async sẽ có thể hủy thao tác gửi request tới server hay theo mình hiểu là nó đóng kết nối tới server .
Khi mình có thử dùng code trên console và đặt Thread.sleep khoảng 2s và cài cancel() sau khi gửi request thì bên server sẽ dừng dk. Còn khi làm trên UI thì lại ko dk

nó huỷ kết nối tới server có nghĩa là exception sẽ dc handle ở bên client (EventB) chứ không phải server (hàm getText).
Nếu bạn vẫn chưa hiểu rõ, hãy comment cái document lên đây.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?