Можно ли переназначить поток другому методу после его создания. Если нет, существуют ли альтернативы?
Если нить не началась, вы можете использовать отражение, но полезность такой вещи очень сомнительна. Почему бы не создать другой экземпляр потока вместо:
var thread = new Thread(Method1);
thread
.GetType()
.GetMethod("SetStartHelper", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(thread, new object[] { new ThreadStart(Method2), 0 });
thread.Start();
Если вы не делаете какие-то странные вещи с помощью API отладки или не размещаете CLR и не играете с внутренними компонентами, то никоим образом нить не может быть "переназначена" новому методу, поскольку это связано с управлением стеком потока.
Что вы можете сделать, так это использовать шаблон команды в своем потоке, чтобы отправить ему рабочие "полезные нагрузки", которые могут меняться со временем:
Action worker=null;
bool running = true;
var t = new Thread(() =>
{
while(running)
{
Action theWorker = worker;
if(theWorker!=null)
{
theWorker();
}
Thread.Sleep(10);
}
});
worker = new Action(() => Console.WriteLine("hi mum"));
t.Start();
Thread.Sleep(100);
worker=new Action(()=>Console.WriteLine("I can see my house from here"));
Thread.Sleep(100);
running = false;
Unless the thread has started ...