-1

特定のタイプのいくつかのファイルのフォルダーを確認し、それらを配列に追加し、それらを1つずつ印刷して削除する必要があります。プロセス中に新しいファイルが追加されると、印刷キューに追加されます。ファイルが1秒ごとに作成されるかどうかを監視しようとしています。これを行うために、タイマー付きの FileSystemWatcher を使用しています。2 つのイベント関数をバインドしようとしていますが、試行時に奇妙なエラーが発生します。私はフォームアプリケーションでこれを行っています.今日初めてこれらの2つの名前空間を見ました.マルチスレッド、バックグラウンドスレッド、またはSystem.Threading.TimerとSystem.Windows.Forms.Timerの違いについて何も知りません.この特定の状況に最適なので、問題がこれらの主題に限定されすぎる場合は、これについても簡単に説明する必要があるかもしれません.

基本的にコードはこれです(これはより大きなプログラムの一部なので、問題に関連するコードだけを貼り付けようとします。また、プロジェクト全体の一部である余分な using 名前空間を気にしないでください。最後に私はしませんここのコードブロックで C# 構文を強調表示する方法を知っており、ctrl+K を使用した書式設定ツールが、次のコード ブロックで読んでいる内容を構成しています。読みやすくするために、少しインデントしてみました。):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.IO.Ports;
using System.Diagnostics;

private Timer timer1; //Windows.Form Timer

private void button1_Click(object sender, EventArgs e) {
  try {
    InitTimer();
    FileSystemWatcher SysWatch = new FileSystemWatcher(FilesPath, "*.*");
    SysWatch.Created += new FileSystemEventHandler(SysWatch_Created);
    SysWatch.EnableRaisingEvents = true;
  }
  catch (Exception exc) {
    MessageBox.Show(exc.Message); 
  }
}

private void InitTimer() {
  timer1 = new Timer();
  timer1.Tick+=new EventHandler(timer1_Tick);
  timer1.Interval = 2000;
  timer1.Start();
}

private void timer1_tick (object sender, EventArgs xz) {
  void SysWatch_Created(object Sender, FileSystemEventArgs w) {
    MessageBox.Show("File " + w.FullPath + "Creato");
  }
}

私がやろうとしていたのは、タイマー内にファイル作成イベントコントローラーをネストして、ファイル作成をチェックすることですが、おそらく私がやっている方法に問題があります。

私はこの種のものを手に入れました(SysWatch_Createdをtimer1_Tickにネストしようとしたとき、それまではすべてが完璧に機能していました)。

ここにリンクの説明を入力

Event Args などで 2 つのメソッドをネストしようとしているという事実と関係があると思います...わかりません

それをより良くする方法の例は大歓迎です。

皆さんありがとう。

4

1 に答える 1

2

そのようなメソッド内にメソッドを配置したり、イベント ハンドラー内にイベント ハンドラーを配置したりすることはできません。タイマー ハンドラーと共にFileSystemWatcher ハンドラーを定義する必要があります。しかし、あなたのウォッチャーはあなたのためにティックオーバースタイルの監視を行い、タイマーではなく、それに応じて発生したときにイベントを発生させます。

少し説明すると、次のように記述するのが理にかなっており、その特定のエラー (または一連のエラー) はもうありません。

private void timer1_tick (object sender, EventArgs xz) {

}

void SysWatch_Created(object Sender, FileSystemEventArgs w) {
  MessageBox.Show("File " + w.FullPath + "Creato");
}

ただし、それでも間隔を置いて呼び出す必要があり、ハンドラー メソッドを手動で呼び出すことは、ここではあまり意味がありません。次の点を考慮してください。

private void timer1_tick (object sender, EventArgs xz) {
  SysWatch_Created(this, null);
}

送信者は FileSystemWatcher であると予想されるかもしれませんが、必ずしもそうであるとは限りませんnull。このコンテキストでは、ウォッチャーだけがこの情報を持っています。

ポイントに戻ります。タイマーは必要ありません。FileSystemWatcher が内部でポーリングを行い、通知ますCreated += new FileSystemEventHandler(SysWatch_Created);。ただし、このことのポーリング間隔を具体的に設定することはできません。

于 2013-03-29T00:29:51.980 に答える