Где я могу найти метод ThreadPool.SwitchTo? - PullRequest
3 голосов
/ 27 января 2011

Я изучаю новую Async CTP и пробую пример кода,

Я наткнулся на этот кусок кода:

public async void button1_Click(object sender, EventArgs e) 
{ 
string text = txtInput.Text; 

await ThreadPool.SwitchTo(); // jump to the ThreadPool 

string result = ComputeOutput(text); 
string finalResult = ProcessOutput(result); 

await txtOutput.Dispatcher.SwitchTo(); // jump to the TextBox’s thread 

txtOutput.Text = finalResult; 
}

Пожалуйста, где я могу найти ThreadPool.SwitchTo? Метод SwithcTo отсутствует в классе ThreadPool

у меня есть ссылка на AsyncCtpLibrary.dll ... но не повезло

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

Для справки, CharlesO ответил на свой вопрос в комментариях выше:

ОК, ребята, Резюме: Предоставляет методы взаимодействия с ThreadPool. Замечания: ThreadPoolEx является заполнитель.

Открытая общая функция SwitchTo () As System.Runtime.CompilerServices.YieldAwaitable Член Сводка System.Threading.ThreadPoolEx: Создает ожидаемое, что асинхронно уступает ThreadPool, когда ожидается.

1 голос
/ 14 декабря 2011

ThreadPool.SwitchTo был удален предположительно, потому что это анит-паттерн.Подумайте, что произойдет, если возникнет исключение, прежде чем вы вернетесь к исходному контексту.Вы не можете использовать блок finally в качестве меры противодействия, чтобы защититься от этого исключения и переключиться обратно, потому что await не может появиться в finally блоках.

public async void button1_Click(object sender, EventArgs e) 
{ 
  await ThreadPool.SwitchTo();
  try
  {
    // Do something dangerous here.
  }
  finally
  {
    await button1.Dispatcher.SwitchTo(); // COMPILE ERROR!
  }

}

Вы, конечно, можете разработать пользовательский ожидаемыйи ожидающие типы для достижения именно того, что было удалено.Однако гораздо лучше использовать Task.Run 1 , чем переключать контексты в середине потока через await.

...