[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??
}
ありがとう