2

[Web メソッド] を呼び出すクライアントがあります。[Web メソッド] では、それ自体が while(true) ループに含まれている特定のファイルの存在を確認しています。ファイルが存在するか、タイムアウトが発生すると、コールバックがクライアントに返されます。

それを実行すると、wp3 プロセスのメモリ使用量が増加することに気付きました。

while(true) ループの代わりに FileWatcher を使用すると、IIS プロセスではなく .Net フレームワークにメモリが配置されると誰かが私に言いました。これをテストしようとしましたが、ファイルが「見つかった」ときにコールバックをクライアントに返す方法がわかりませんでした。

私のコード:

【デスクトップアプリ】

private void _tmrRequestHandler_Tick(object sender, EventArgs e)
{
try
{
_tmrRequestHandler.enabled = false;
//call my web service async
}
catch
{
_tmrRequestHandler.enabled = true;
}
}

private void WSconnector_GetRequestsCompleted(object sender, wsConnector.GetRequestsCompletedEventArgs e)
{
//do stuff
_tmrRequestHandler.enabled = true;
}

[ウェブサーバー] - 古い方法

[WebMethod]
public string[] GetRequests(string _mac)
{
   string[] _response = null;
   while (_fileCount == 0)
   {
    string[] _files = Directory.GetFiles("my root path" + _mac, "*.dat");
    _fileCount = _files.Length;
    if (_files.Length > 0)
    {
     _response = new string[_files.Length];
     _files.CopyTo(_response, 0);
     return _response;
    }
 }

}

[Web サーバー] - 提案された新しい方法

[WebMethod]
public string[] GetRequests(string _mac)
{
    string[] _response = null;
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = AbsoluteRequestQueue + _mac;
    watcher.NotifyFilter = NotifyFilters.LastWrite;
    watcher.Filter = "*.dat*";
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
    //file found!!
    //HOW DO I GIVE CALLBACK TO MY CLIENT AND SHOULD I REALLY BE CONSIDEREING DOING IT THIS WAY??
}

ありがとう

4

0 に答える 0