我有一個方法HandleAcceptedConnection是Task.Run(),我想異步運行(在另一個單獨的線程)。我試圖聲明HandleAcceptedConnection作爲異步方法,不要調用await,但它似乎不是異步運行。我可以確認我可以在另一個Task.Run()下面使用Task.Run()(通過觀察線程ID),但推薦使用它嗎?我可以將Task.Run包裝在另一個Task.Run()下嗎?
private async void Start_Click(object sender, RoutedEventArgs e)
{
var task = Task.Run(() =>
{
while (isContinue)
{
var handler = listener.Accept();
// handle connection
Log("Before");
Log("ThreadId Accept " + Thread.CurrentThread.ManagedThreadId);
// i want to run method below asynchronously. i want to
// wrap it under Task.Run() but i am already under
// Task.Run(). i set HandleAcceptedConnection as async. i thought by not
// calling await on HandleAcceptedConnection, HandleAcceptedConnection
// is asynchronous
HandleAcceptedConnection(handler);
Log("After");
isContinue = true;
}
});
await task;
}
private async Task HandleAcceptedConnection(Socket handler)
{
Log("ThreadId HandleAcceptedConnection " + Thread.CurrentThread.ManagedThreadId);
Log("Under HandleAcceptedConnection");
Thread.Sleep(10000);
}
當我運行此,日誌說
Before
Under HandleAcceptedConnection
After
我想
Before
After
Under HandleAcceptedConnection
我想HandleAcceptedConnection被異步運行。我應該將它包裝在另一個Task.Run中,還是它已經是異步的?
你的方法同步運行,因爲它不包含'await'聲明。但即使它*異步運行,這也就意味着您根本無法保證「After」和「Under」出現的順序。如果您需要*「After」出現在「Under」之前, ,只需將方法調用移動到最後。你想在這裏做什麼? – Jon
我認爲你需要更深入地讀入async/await/Tasks。主要理解:async/await/Task不一定等於多線程。 – Krumelur
@Jon「」之下「之後」之前的「」之後的「」僅僅是指示HandleAcceptedConnection是同步還是異步運行。知道HandleAcceptedConnection是否運行異步的更好方法是通過監視線程(我剛剛添加)。我想要的只是在'上面的調用者'的另一個線程/異步中運行HandleAcceptedConnection。 –