0

これは私のコードです:

private void TaskGestioneCartelle()
{
    Task.Factory.StartNew(() => GeneraListaCartelle())
        .ContinueWith(t => GeneraListaCartelleCompletata()
        , CancellationToken.None
        , TaskContinuationOptions.None
        , TaskScheduler.FromCurrentSynchronizationContext());
}

private void GeneraListaCartelle()
{
    // ... code
}

private void GeneraListaCartelleCompletata()
{
    Task.Factory.StartNew(() => CopiaCartelle())
        .ContinueWith(t => CopiaCartelleCompletato()
        , CancellationToken.None
        , TaskContinuationOptions.None
        , TaskScheduler.FromCurrentSynchronizationContext());
}

private void CopiaCartelle()
{
    if (txtLog.InvokeRequired)
    {
        txtLog.BeginInvoke(new MethodInvoker(delegate { txtLog.AppendText("Copio cartelle in corso..." + Environment.NewLine); }));
    }
}

スレッドを開始します。終了したら、(Continue with から) 別のスレッドを開始し、UI の Control に何かを書き込もうとします。しかし、実際には何も書かれていませんtxtLog。どこが間違っていますか?

4

1 に答える 1

3

UIのコントロールに何かを書き込もうとしています。しかし、実際にはtxtLogには何も書かれていません。どこが間違っていますか?

その時、Invokeは必要ないからです。if ステートメントを変更elseして、同じことを行う部分を追加できます。

private void CopiaCartelle()
{
    if (txtLog.InvokeRequired)
    {
        txtLog.BeginInvoke(new MethodInvoker(delegate { txtLog.AppendText("Copio cartelle in corso..." + Environment.NewLine); }));
    }
    else // this part when Invoke is not required. 
    {
     txtLog.AppendText("Copio cartelle in corso..." + Environment.NewLine);
    }
}

メソッドへのテキスト追加パスをリファクタリングし、そのメソッドをif-else

于 2013-04-18T10:22:22.117 に答える