我希望在一個自定義的執行緒池上執行一堆ValueTask回傳的函式--即在我自己生成和處理的一堆執行緒上,而不是默認的ThreadPool。
意思是說,這些函式的所有同步部分,包括任何潛在的任務延續,都應該在我的自定義執行緒池中執行。
從概念上講,類似于:
的東西。
class Example
{
asyncValueTask DoStuff(>int something)
{
// ......在這里做一些事情,可能會同步完成或不同步,誰知道呢。
}
private void Test()
{
for (int i = 0; i < 1_000; i )
{
Func<ValueTask> method = () => DoStuff(1) 。
MyThreadPool.Queue(method)。
}
}
什么是最好的方法呢?
我目前的方法是這樣的:
class Example
{
async ValueTask DoStuff(int something)
{
// ......在這里做一些事情,可能會同步完成或不同步,誰知道呢。
}
private void Test()
{
SynchronizationContext myContext = new MyCustomThreadPoolSynchronisationContext()。
TaskScheduler myScheduler。
var prevCtx = SynchronizationContext.Current;
try
{
SynchronizationContext.SetSynchronizationContext(myContext)。
myScheduler = TaskScheduler.FromCurrentSynchronizationContext()。
}
finally
{
SynchronizationContext.SetSynchronizationContext(prevCtx)。
}
var myTaskFactory = new TaskFactory(myScheduler)。
for (int i = 0; i < 1_000; i )
{
myTaskFactory.StartNew(() => DoStuff(i).AsTask())。
}
}
}
這似乎是可行的,但必須將ValueTask轉換為Task,并將其提交給TaskFactory,感覺非常笨拙。
而且不得不安裝我的同步背景關系,只是為了能夠掌握一個適當的TaskScheduler(然后立即回傳到舊的同步背景關系),感覺也很不對勁。
我目前的方法是否存在任何概念上的缺陷?
更好的是,是否有任何更好的、不那么尷尬的方法來實作這一目標?
uj5u.com熱心網友回復:
我所讀到的關于創建自定義 ThreadPool 的所有內容都說不要。
另一個選擇是在共享執行緒池上使用一個自定義的任務調度器。
您可以像這樣使用TaskScheduler類:
static async 任務 Main(string[] args)
{
//創建一個使用四個執行緒的調度器。
LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(4)。
List<Task> tasks = new List<Task>();
TaskFactory factory = new TaskFactory(lcts)。
CancellationTokenSource cts = new CancellationTokenSource(10000)。
//啟動20個任務,以100%的CPU運行4個執行緒。
for (var i = 0; i < 20; i )
tasks.Add(factory.StartNew(() => {
while (true)
if (cts.Token.IsCancellationRequested)
break;
},cts.Token))。
await Task.WhenAll(tasks);
cts.Dispose()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/329893.html
標籤:
