Có thể sử dụng các đối tượng COM với TPL 100%. Mặc dù, theo mặc định, TPL sẽ sử dụng tiêu chuẩn .NET ThreadPool, TPL có một điểm mở rộng thông qua the TaskScheduler
class cho phép bạn cung cấp lịch trình của riêng bạn có thể gửi công việc tới các chủ đề mà bạn đã tạo.
Trong trường hợp sử dụng các đối tượng COM trước tiên bạn cần phải biết nếu lớp COM yêu cầu luồng STA hoặc luồng MTA. Nếu MTA luồng, sau đó không có gì đặc biệt mà cần phải được thực hiện bởi vì lớp COM có thể đã được sử dụng từ bất kỳ chủ đề ngẫu nhiên. Thật không may hầu hết các đối tượng COM cổ điển có xu hướng dựa vào luồng STA và đó là khi bạn cần sử dụng một tùy chỉnh TaskScheduler
sao cho bất kỳ chuỗi .NET nào bạn đang sử dụng chúng đều là initialized as an STA compatible thread.
Trong khi TaskSchedulers không phải là chính xác tầm thường để viết, họ không thực sự là khó để viết, hoặc nếu bạn đã có một sự hiểu biết cơ bản về luồng. May mắn là the ParallelExtensions Extras library đã cung cấp một lớp học StaTaskScheduler
vì vậy bạn thậm chí không cần phải viết bất cứ điều gì cho mình. Có a great blog post here bởi nhóm PFX thảo luận về việc triển khai và một số trường hợp sử dụng cho lớp StaTaskScheduler
.
Về cơ bản, bạn sẽ muốn khởi tạo StaTaskScheduler
mới ở dạng tĩnh ở đâu đó trên một trong các lớp học của bạn và sau đó chỉ cần bắt đầu Tasks
xác định rằng chúng được lên lịch bởi trường hợp đó. Điều đó sẽ trông giống như sau:
// Create a static instance of the scheduler specifying some max number of threads
private static readonly StaTaskScheduler MyStaTaskScheduler = new StaTaskScheduler(4);
....
// Then specify the scheduler when starting tasks that need STA threading
Task.TaskFactory.StartNew(
() =>
{
MyComObject myComObject = new MyComObject();
myComObject.DoSomething();
// ... etc ...
},
CancellationToken.None,
TaskCreationOptions.None,
MyStaTaskScheduler);
Nguồn
2011-02-12 17:31:56
Âm thanh như một ứng cử viên hoàn hảo để thử nghiệm nhanh ... hãy dùng thử. – Oded