ThreadPool, безусловно, можно использовать из любого потока в C #.
Предположим, что когда вы нажимаете кнопку в вашем пользовательском интерфейсе, она будет вызывать:
object state = ...some value...;
ThreadPool.QueueUserWorkItem(MyHandler, state);
...
private void MyHandler(object state)
{
object newState = ... do something with state ...
ThreadPool.QueueUserWorkItem(HandleMoreWorkToDo, newState);
}
Вам просто нужно быть осторожным с тем, какие ресурсы вы используете в своих обработчиках, чтобы они не изменяли состояние объекта, которым манипулируют в другом потоке.