.NET 4.0ならBeginInvokeとかInvokeとか使わずTaskを使うといい。

Task.Factory.StartNew( () =>
{
    // 別スレッド
    Thread.Sleep( 3000 ); // 重い処理のつもり
    return 1000;
} ).ContinueWith( task =>
{
    // UIスレッド
    this.label.Text = task.Result.ToString();
} , TaskScheduler.FromCurrentSynchronizationContext() );