Помимо причин и возможных решений Enigmativity уже сказала, что вы всегда можете сделать что-то вроде этого:
var context = TaskScheduler.FromCurrentSynchronizationContext();
Task<SomeResultClass>.Factory.StartNew(SomeWorkMethod).ContinueWith((t) =>
{
if (!myListControl.InvokeRequired)
myListControl.Add(t.Result); // <-- this causes an exception
else
myListControl.Invoke((Action)(() => myListControl.Add(t.Result)));
}, context);
(при условии, что это WinForms)
если вы хотите изменить контроль над add в метод и использовать InvokeRequired внутри метода для вызова себя внутри Invoke, если необходимо:
private void AddToListControl(MyItem item)
{
if (myListControl.InvokeRequired)
{
myListControl.Invoke((Action)(() => AddToListControl(item)));
return;
}
myListControl.Add(item);
}
То, на что намекал Enigmativity, выглядит примерно так:
var result =
Task<Action>.Factory.StartNew(SomeWorkMethod).ContinueWith((t) =>
{
return () => myListControl.Add(t.Result);
});
result.Result();
Но ИМХО, это то же самое место, которое вы получили с самого начала, потому что вам нужно еще раз вызвать Result-Action в нужном потоке.