2

スレッド内から共有ログファイルにアクセスする必要があるので、MethodInvokerを使用してファイルを読み取り、エントリが見つかったかどうかに応じてブール値を返そうとします。しかし、このエラーが発生すると、取得方法がわかりません。私にブール値を返すために:

ブロック内の一部の戻り型がデリゲート戻り型に暗黙的に変換できないため、匿名メソッドをデリゲート型'System.Windows.Forms.MethodInvoker'に変換できません

    private void searchLogInThread(string msg, string fileName)
    {
        Invoke(new MethodInvoker(
                       delegate
                       {
                           StreamReader re = File.OpenText(fileName);

                           string input = null;
                           while ((input = re.ReadLine()) != null)
                           {

                               if (input.Contains(msg))
                               {
                                   re.Close();
                                   return true;
                               }

                           }
                           re.Close();
                           return false;
                       }
                       ));
    }
4

3 に答える 3

4

説明

MethodInvokerはデリゲートであり、結果はありません。自分で作成する必要があります。

サンプル

public delegate bool MethodInvokerWithBooleanResult();

Invoke(new MethodInvokerWithBooleanResult(
             delegate
             {
                            // do something and return a bool
                            return true;
             }
         ));

アップデート

別の方法は使用することですFunc<bool>

Invoke(new Func<bool>(
        delegate
        {
                    // do something and return a bool
                    return true;
        }
    ));

詳しくは

于 2012-05-09T15:05:47.540 に答える
4

MethodInvoker何も返すことはできません。デリゲートにはvoidリターンタイプがあります。値を返す必要がある場合は、別のデリゲートを使用する必要があります(例Func<bool>)。

これがコントロール内にあると仮定すると、とにかくすべてが間違った方法で行われていると思います-UIスレッドControl.Invokeでそのすべてのコード(ファイルの読み取り)を実行するを使用しています。そうしないでください。

また、とにかく結果をどのように使用するかはわかりません...基本的には、デザインを大幅に再考する必要があると思います。現時点では混乱しています。

于 2012-05-09T15:05:54.680 に答える
0

MethodInvoker戻りタイプを定義しません。匿名メソッドまたはラムダ式から戻り値を取得するには、さまざまな方法があります。しかし、どのように使用されるのかについて根本的な誤解があるようInvokeです。指定したコードは、バックグラウンドスレッドではまったく実行されません。

Taskクラスを使用して、バックグラウンドでファイルを読み取ります。バックグラウンドスレッドでデリゲートを実行StartNewするために使用します。Func<TResult>次に、呼び出しContinueWithてコントロールをUIに戻し、戻り値を抽出して、それを使用してコントロールを操作できます。

private void searchLogInThread(string msg, string fileName)
{
  Task.Factory
    .StartNew(() =>
    {
      // This executes on a background thread.

      using (StreamReader re = File.OpenText(fileName))
      {
        string input = null;
        while ((input = re.ReadLine()) != null)
        {
          if (input.Contains(msg))
          {
            return true;
          }
        }
        return false;
      }
    })
    .ContinueWith(task =>
    {
      // This executes on the UI thread.

      bool result = task.Result; // Extract result from the task here.

      MessageBox.Show(result.ToString());

    }, TaskScheduler.FromCurrentSynchronizationContext);
}
于 2012-05-09T15:17:19.580 に答える