我正在寫一個遊戲,並且使用OpenGL,我需要將一些工作轉移到OpenGL上下文處於活動狀態的渲染線程中,但其他一切都由普通線程池處理。我怎樣纔能有兩個獨立的任務計劃?
有沒有一種方法可以強制任務在特殊線程池中執行,並且從async
創建的任何新任務也將被分派到該線程池?
我想要一些專門用於渲染的線程,我希望能夠使用例如async
和await
來創建和填充頂點緩衝區。
如果我只是用一個自定義的任務調度和new Factory(new MyScheduler())
似乎任何後續Task
對象將被分派到線程池反正這裏Task.Factory.Scheduler
突然是null
。
下面的代碼應該表現出什麼,我希望能夠做到:
public async Task Initialize()
{
// The two following tasks should run on the rendering thread pool
// They cannot run synchronously because that will cause them to fail.
this.VertexBuffer = await CreateVertexBuffer();
this.IndexBuffer = await CreateIndexBuffer();
// This should be dispatched, or run synchrounousyly, on the normal thread pool
Vertex[] vertices = CreateVertices();
// Issue task for filling vertex buffer on rendering thread pool
var fillVertexBufferTask = FillVertexBufffer(vertices, this.VertexBuffer);
// This should be dispatched, or run synchrounousyly, on the normal thread pool
short[] indices = CreateIndices();
// Wait for tasks on the rendering thread pool to complete.
await FillIndexBuffer(indices, this.IndexBuffer);
await fillVertexBufferTask; // Wait for the rendering task to complete.
}
有什麼辦法來實現這一點,或者是它的async
/await
範圍之外?
這看起來很有希望。有什麼我可以做'async'接受我的自定義圖形任務嗎?我得到一個錯誤,說我必須使用'Task'或'Task',而C#標準規定它必須是'System.Threading.Tasks.Task'。 –
GeirGrusom
不,你不能。但是你可以直接返回你的特殊圖形任務。在那種情況下,你不能在任務中使用'await'。但這不應該要求。請注意,'async'函數總是**在與調用函數相同的同步上下文中運行。 – Nitram
還不錯。我認爲這是我需要的:) – GeirGrusom