ต่อไปนี้เป็นวิธีแก้ปัญหาหลายประการตามลำดับจากมากไปหาน้อย:
1. ใช้default(CancellationToken)
เป็นค่าเริ่มต้น:
Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }
ตามความหมายCancellationToken.None
จะเป็นตัวเลือกที่เหมาะสำหรับค่าเริ่มต้น แต่ไม่สามารถใช้เช่นนี้ได้เนื่องจากไม่ใช่ค่าคงที่เวลาคอมไพล์ default(CancellationToken)
เป็นสิ่งที่ดีที่สุดถัดไปเนื่องจากเป็นค่าคงที่เวลาคอมไพล์และบันทึกอย่างเป็นทางการว่าเทียบเท่ากับCancellationToken.None
.
2. ระบุวิธีการโอเวอร์โหลดโดยไม่มีCancellationToken
พารามิเตอร์:
หรือหากคุณต้องการให้เมธอดโอเวอร์โหลดพารามิเตอร์เสริม (ดูสิ่งนี้และคำถามนี้ในหัวข้อนั้น):
Task DoAsync(CancellationToken ct) { … }
Task DoAsync() => DoAsync(CancellationToken.None);
สำหรับวิธีการเชื่อมต่อสามารถทำได้โดยใช้วิธีการขยาย:
interface IFoo
{
Task DoAsync(CancellationToken ct);
}
static class Foo
{
public static Task DoAsync(this IFoo foo) => foo.DoAsync(CancellationToken.None);
}
ส่งผลให้อินเทอร์เฟซที่บางลงและช่วยลดการใช้งานจากการเขียนวิธีการส่งต่อที่มากเกินไปอย่างชัดเจน
3. ทำให้พารามิเตอร์เป็นโมฆะและใช้null
เป็นค่าเริ่มต้น:
Task DoAsync(…, CancellationToken? ct = null)
{
… ct ?? CancellationToken.None …
}
ผมชอบวิธีนี้น้อยเพราะประเภท nullable ??
มาพร้อมกับค่าใช้จ่ายรันไทม์ขนาดเล็กและการอ้างอิงถึงการยกเลิกโทเค็นมากขึ้นอย่างละเอียดเพราะผู้ประกอบการ
CancellationToken.None
default(CancellationToken)