| Michael |
This has been posted to twice to aspngescalate, twice to aspngfreeforall and once to aspngcache without a satisfactory reply. I guess you guys must all be on holidays.
I'm having some troubles with the application cache. I use the following line of code to add an entry to the cache
Context.Cache.Add(cacheKey, fileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
First I create a file and then I cache an object "fileInfo" which contains information about this file. If the file is deleted I'd like the entry in the cache relating to this file removed, hence the addition of the dependency. My problem is that frequently the entry is being removed immediately with the reason "DependencyChanged".
I dont understand why this is as it shouldn't even be tracking changes to the file for a minute. If I make the thread sleep for 400ms before adding an entry to the cache, the entry is not being removed (this btw is an unacceptable solution as it is not robust and speed in this app is critical). I suspect the file system hasn't finished writing the file at the time it's information is added to the cache, it seems like the start time for tracking is being ignored. Is this a bug ?
Secondly my other gripe with the Cache class is that entries that do survive dont seem to be staying in the cache anywhere near the 20 minutes I've set, more like 2-4 minutes, with the reason "Underused", again I dont quite understand this because it seems to be occuring even when testing with a single item in the cache which is being used continuously.
Has anyone else experienced any of these problems have an explanation and/or a workaround ?
webform1.aspx:-
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="AntiqueShop.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 323px; POSITION: absolute; TOP: 180px" runat="server" Text="Button"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 320px; POSITION: absolute; TOP: 74px" runat="server" Width="354px">Label</asp:Label> </form> </body> </HTML>
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.Text; using System.IO;
namespace AntiqueShop { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected class AFileInfo { public string fileName; public string path; }
protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; private CacheItemRemovedCallback onRemoveFile = null; static int count = 0;
private void Page_Load(object sender, System.EventArgs e) { onRemoveFile = new CacheItemRemovedCallback(RemoveCachedFileCallback); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private void Button1_Click(object sender, System.EventArgs e) { string testFile = "testit" + count.ToString() + ".txt"; string filepath = MapPath(testFile);
AFileInfo afileInfo = new AFileInfo(); afileInfo.fileName = Path.GetFileName(testFile); afileInfo.path = filepath;
Cache.Add(count.ToString(), afileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
FileStream testStream = File.Open(filepath, FileMode.OpenOrCreate); byte [] testbytes UnicodeEncoding.Unicode.GetBytes(DateTime.Now.ToString()); testStream.Write(testbytes, 0, testbytes.Length); testStream.Close();
++count; }
private void RemoveCachedFileCallback(string k, object v, CacheItemRemovedReason r) { try { AFileInfo afileInfo = (AFileInfo)v; if (afileInfo != null) File.Delete(afileInfo.path); } catch(Exception e) { Label1.Text = e.Message; } } } }
Michael Lang MS .NET Developer Ph: +61 4 17498620 www.michaellang.com.au
|
|
| |
| |
| Paul D. Murphy |
I'm not spending time on the cache list anymore, but you might want to hit the news archives and peek out Rob Howards posts. I think-- this could be bad information - that there are some heuristics in the cache that you don't have total control over that will depending on the environment release your objects early. I believe Rob made a post that described this at one point in time. Again, I'm going entirely off of memory and Robs post might have been about a completely different issue.
I'm curious about your testing environment. Are you testing the code under the extreme load the application will demand? Or on your workstation? The difference in the load might have an impact on the performance if my memory is correct.
Paul
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 10:05 AM To: aspngescalate Subject: [aspngescalate] Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
This has been posted to twice to aspngescalate, twice to aspngfreeforall
and once to aspngcache without a satisfactory reply. I guess you guys must all be on holidays.
I'm having some troubles with the application cache. I use the following line of code to add an entry to the cache
Context.Cache.Add(cacheKey, fileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
First I create a file and then I cache an object "fileInfo" which contains information about this file. If the file is deleted I'd like the entry in the cache relating to this file removed, hence the addition of the dependency. My problem is that frequently the entry is being removed immediately with the reason "DependencyChanged".
I dont understand why this is as it shouldn't even be tracking changes to the file for a minute. If I make the thread sleep for 400ms before adding an entry to the cache, the entry is not being removed (this btw is an unacceptable solution as it is not robust and speed in this app is critical). I suspect the file system hasn't finished writing the file at the time it's information is added to the cache, it seems like the start time for tracking is being ignored. Is this a bug ?
Secondly my other gripe with the Cache class is that entries that do survive dont seem to be staying in the cache anywhere near the 20 minutes I've set, more like 2-4 minutes, with the reason "Underused", again I dont quite understand this because it seems to be occuring even when testing with a single item in the cache which is being used continuously.
Has anyone else experienced any of these problems have an explanation and/or a workaround ?
webform1.aspx:-
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="AntiqueShop.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 323px; POSITION: absolute; TOP: 180px" runat="server" Text="Button"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 320px; POSITION: absolute; TOP: 74px" runat="server" Width="354px">Label</asp:Label> </form> </body> </HTML>
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.Text; using System.IO;
namespace AntiqueShop { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected class AFileInfo { public string fileName; public string path; }
protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; private CacheItemRemovedCallback onRemoveFile = null; static int count = 0;
private void Page_Load(object sender, System.EventArgs e) { onRemoveFile = new CacheItemRemovedCallback(RemoveCachedFileCallback); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private void Button1_Click(object sender, System.EventArgs e) { string testFile = "testit" + count.ToString() + ".txt"; string filepath = MapPath(testFile);
AFileInfo afileInfo = new AFileInfo(); afileInfo.fileName = Path.GetFileName(testFile); afileInfo.path = filepath;
Cache.Add(count.ToString(), afileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
FileStream testStream = File.Open(filepath, FileMode.OpenOrCreate); byte [] testbytes UnicodeEncoding.Unicode.GetBytes(DateTime.Now.ToString()); testStream.Write(testbytes, 0, testbytes.Length); testStream.Close();
++count; }
private void RemoveCachedFileCallback(string k, object v, CacheItemRemovedReason r) { try { AFileInfo afileInfo = (AFileInfo)v; if (afileInfo != null) File.Delete(afileInfo.path); } catch(Exception e) { Label1.Text = e.Message; } }
} }
Michael Lang MS .NET Developer Ph: +61 4 17498620 www.michaellang.com.au <http://www.michaellang.com.au/>
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
|
|
| |
|
| |
| Michael |
The code example listed below produces inconsistant results on a workstation with a single session.
It appears that the cache dependency option to delay tracking to a certain time simply doesn't work and that tracking begins immediately..... unless I'm misunderstanding it (I hope I am because it would make my life at lot easier if this did work).
-----Original Message----- From: Paul D. Murphy [mailto:Click here to reveal e-mail address] Sent: Friday, 14 June 2002 8:34 AM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I'm not spending time on the cache list anymore, but you might want to hit the news archives and peek out Rob Howards posts. I think-- this could be bad information - that there are some heuristics in the cache that you don't have total control over that will depending on the environment release your objects early. I believe Rob made a post that described this at one point in time. Again, I'm going entirely off of memory and Robs post might have been about a completely different issue.
I'm curious about your testing environment. Are you testing the code under the extreme load the application will demand? Or on your workstation? The difference in the load might have an impact on the performance if my memory is correct.
Paul
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 10:05 AM To: aspngescalate Subject: [aspngescalate] Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
This has been posted to twice to aspngescalate, twice to aspngfreeforall and once to aspngcache without a satisfactory reply. I guess you guys must all be on holidays.
I'm having some troubles with the application cache. I use the following line of code to add an entry to the cache
Context.Cache.Add(cacheKey, fileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
First I create a file and then I cache an object "fileInfo" which contains information about this file. If the file is deleted I'd like the entry in the cache relating to this file removed, hence the addition of the dependency. My problem is that frequently the entry is being removed immediately with the reason "DependencyChanged".
I dont understand why this is as it shouldn't even be tracking changes to the file for a minute. If I make the thread sleep for 400ms before adding an entry to the cache, the entry is not being removed (this btw is an unacceptable solution as it is not robust and speed in this app is critical). I suspect the file system hasn't finished writing the file at the time it's information is added to the cache, it seems like the start time for tracking is being ignored. Is this a bug ?
Secondly my other gripe with the Cache class is that entries that do survive dont seem to be staying in the cache anywhere near the 20 minutes I've set, more like 2-4 minutes, with the reason "Underused", again I dont quite understand this because it seems to be occuring even when testing with a single item in the cache which is being used continuously.
Has anyone else experienced any of these problems have an explanation and/or a workaround ?
webform1.aspx:-
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="AntiqueShop.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content=" http://schemas.microsoft.com/intellisense/ie5 <http://schemas.microsoft.com/intellisense/ie5> "> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 323px; POSITION: absolute; TOP: 180px" runat="server" Text="Button"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 320px; POSITION: absolute; TOP: 74px" runat="server" Width="354px">Label</asp:Label> </form> </body> </HTML>
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.Text; using System.IO;
namespace AntiqueShop { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected class AFileInfo { public string fileName; public string path; }
protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; private CacheItemRemovedCallback onRemoveFile = null; static int count = 0;
private void Page_Load(object sender, System.EventArgs e) { onRemoveFile = new CacheItemRemovedCallback(RemoveCachedFileCallback); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private void Button1_Click(object sender, System.EventArgs e) { string testFile = "testit" + count.ToString() + ".txt"; string filepath = MapPath(testFile);
AFileInfo afileInfo = new AFileInfo(); afileInfo.fileName = Path.GetFileName(testFile); afileInfo.path = filepath;
Cache.Add(count.ToString(), afileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
FileStream testStream = File.Open(filepath, FileMode.OpenOrCreate); byte [] testbytes UnicodeEncoding.Unicode.GetBytes(DateTime.Now.ToString()); testStream.Write(testbytes, 0, testbytes.Length); testStream.Close();
++count; }
private void RemoveCachedFileCallback(string k, object v, CacheItemRemovedReason r) { try { AFileInfo afileInfo = (AFileInfo)v; if (afileInfo != null) File.Delete(afileInfo.path); } catch(Exception e) { Label1.Text = e.Message; } }
} }
Michael Lang
MS .NET Developer Ph: +61 4 17498620 <http://www.michaellang.com.au/> www.michaellang.com.au
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
|
|
| |
|
| |
| Michael |
It's simply a means of triggering removal of a cache entry based on the date and time stamp of the file. I think the idea behind linking cache entries to the date time stamp on a file is to cater for a common scenario where you fetch the data from the cache and if it is not found in the cache reload it from a file. In my instance I'm doing things a little differently. I'm creating a file based on a http request, rather than recreating this file for every request that comes through. I'm linking the requests details to the file using an entry in the cache. When a request comes in I check the cache for the request and fetch the details of the file. If the file is deleted I want the entry removed from the cache so it gets recreated. My problem is the file is sometimes being deleted immediately after its added to the cache because the cache framework thinks the file has changed. I've attempted to use the delay to try and avoid this confusion..... with no success. -----Original Message----- From: Feduke Cntr Charles R [mailto:Click here to reveal e-mail address] Sent: Saturday, 15 June 2002 12:00 AM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I've been reading this cache thread and the lack of answers for it. This got me thinking, because obviously I must be implementing the cache wrong, why does the cache link to files on disk in the first place? I wrote a wrapper class for my ASP.NET application that will load a dataset on request to it if its not already loaded from the cache (reload if necessary) and reads all the SQL Select statement from a *.xml file I wrote when requested. What's the right way to use the cache?
— Chuck -----Original Message----- From: Paul D. Murphy [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 6:34 PM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I’m not spending time on the cache list anymore, but you might want to hit the news archives and peek out Rob Howards posts. I think-- this could be bad information – that there are some heuristics in the cache that you don’t have total control over that will depending on the environment release your objects early. I believe Rob made a post that described this at one point in time. Again, I’m going entirely off of memory and Robs post might have been about a completely different issue.
I’m curious about your testing environment. Are you testing the code under the extreme load the application will demand? Or on your workstation? The difference in the load might have an impact on the performance if my memory is correct.
Paul
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 10:05 AM To: aspngescalate Subject: [aspngescalate] Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
This has been posted to twice to aspngescalate, twice to aspngfreeforall and once to aspngcache without a satisfactory reply. I guess you guys must all be on holidays.
I'm having some troubles with the application cache. I use the following line of code to add an entry to the cache
Context.Cache.Add(cacheKey, fileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
First I create a file and then I cache an object "fileInfo" which contains information about this file. If the file is deleted I'd like the entry in the cache relating to this file removed, hence the addition of the dependency. My problem is that frequently the entry is being removed immediately with the reason "DependencyChanged".
I dont understand why this is as it shouldn't even be tracking changes to the file for a minute. If I make the thread sleep for 400ms before adding an entry to the cache, the entry is not being removed (this btw is an unacceptable solution as it is not robust and speed in this app is critical). I suspect the file system hasn't finished writing the file at the time it's information is added to the cache, it seems like the start time for tracking is being ignored. Is this a bug ?
Secondly my other gripe with the Cache class is that entries that do survive dont seem to be staying in the cache anywhere near the 20 minutes I've set, more like 2-4 minutes, with the reason "Underused", again I dont quite understand this because it seems to be occuring even when testing with a single item in the cache which is being used continuously.
Has anyone else experienced any of these problems have an explanation and/or a workaround ?
webform1.aspx:-
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="AntiqueShop.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 323px; POSITION: absolute; TOP: 180px" runat="server" Text="Button"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 320px; POSITION: absolute; TOP: 74px" runat="server" Width="354px">Label</asp:Label> </form> </body> </HTML>
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.Text; using System.IO;
namespace AntiqueShop { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected class AFileInfo { public string fileName; public string path; }
protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; private CacheItemRemovedCallback onRemoveFile = null; static int count = 0;
private void Page_Load(object sender, System.EventArgs e) { onRemoveFile = new CacheItemRemovedCallback(RemoveCachedFileCallback); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private void Button1_Click(object sender, System.EventArgs e) { string testFile = "testit" + count.ToString() + ".txt"; string filepath = MapPath(testFile);
AFileInfo afileInfo = new AFileInfo(); afileInfo.fileName = Path.GetFileName(testFile); afileInfo.path = filepath;
Cache.Add(count.ToString(), afileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
FileStream testStream = File.Open(filepath, FileMode.OpenOrCreate); byte [] testbytes UnicodeEncoding.Unicode.GetBytes(DateTime.Now.ToString()); testStream.Write(testbytes, 0, testbytes.Length); testStream.Close();
++count; }
private void RemoveCachedFileCallback(string k, object v, CacheItemRemovedReason r) { try { AFileInfo afileInfo = (AFileInfo)v; if (afileInfo != null) File.Delete(afileInfo.path); } catch(Exception e) { Label1.Text = e.Message; } }
} }
Michael Lang
MS .NET Developer Ph: +61 4 17498620 www.michaellang.com.au
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT | [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
|
|
| |
|
| |
| Martin Garins |
SSB3b3VsZCB0aGluayByYXRoZXIgdGhhbiB1c2luZyB0aGUgYnVpbHQgaW4gY2FjaGUgbWVjaGFu aXNtIHdoaWNoIHdhcyBub3QgcmVhbGx5IGRlc2lnbmVkIGZvciB5b3VyIHB1cnBvc2UuDQpZb3Ug c2hvdWxkIGxvb2sgYXQgd3JpdGluZyB5b3VyIG93biBzdHJ1Y3R1cmUgYW5kIGFuZCB1c2UgdGhl IGZpbGVzeXN0ZW0gd2F0Y2hlciBvYmplY3QgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgdG8gZmlsZXMg YW5kIHJlbW92ZSBvciBhZGQgdGhlbSB5b3UgeW91ciBvd24gY2FjaGUgYXMgbmVlZGVkLg0KIA0K SWYgSSB3YXMgdHJ5aW5nIHRvIGRvIHdoYXQgSSB0aGluayB5b3UgYXJlIHRyeWluZyB0byBkbyB0 aGlzIGlzIGhvdyBJIHdvdWxkIGRvIGl0Lg0KIA0KTWFydHkNCg0KCS0tLS0tT3JpZ2luYWwgTWVz c2FnZS0tLS0tIA0KCUZyb206IE1pY2hhZWwgW21haWx0bzptbGFuZ0BtaWNoYWVsbGFuZy5jb20u YXVdIA0KCVNlbnQ6IFNhdCA2LzE1LzIwMDIgMTA6MzcgQU0gDQoJVG86IGFzcG5nZXNjYWxhdGUg DQoJQ2M6IA0KCVN1YmplY3Q6IFthc3BuZ2VzY2FsYXRlXSBSRTogQ2FjaGUgZGVwZW5kZW5jaWVz IEJVRy4uLi4gT05FIExBU1QgRklOQUwgQVRURU1QVCBUTyBHRVQgQU4gQU5TV0VSDQoJDQoJDQoJ SXQncyBzaW1wbHkgYSBtZWFucyBvZiB0cmlnZ2VyaW5nIHJlbW92YWwgb2YgYSBjYWNoZSBlbnRy eSBiYXNlZCBvbiB0aGUgZGF0ZSBhbmQgdGltZSBzdGFtcCBvZiB0aGUgZmlsZS4gICBJIHRoaW5r IHRoZSBpZGVhIGJlaGluZCBsaW5raW5nIGNhY2hlIGVudHJpZXMgdG8gdGhlIGRhdGUgdGltZSBz dGFtcCBvbiBhIGZpbGUgaXMgdG8gY2F0ZXIgZm9yIGEgY29tbW9uIHNjZW5hcmlvIHdoZXJlIHlv dSBmZXRjaCB0aGUgZGF0YSBmcm9tIHRoZSBjYWNoZSBhbmQgaWYgaXQgaXMgbm90IGZvdW5kIGlu IHRoZSBjYWNoZSByZWxvYWQgaXQgZnJvbSBhIGZpbGUuICBJbiBteSBpbnN0YW5jZSBJJ20gZG9p bmcgdGhpbmdzIGEgbGl0dGxlIGRpZmZlcmVudGx5LiAgSSdtIGNyZWF0aW5nIGEgZmlsZSBiYXNl ZCBvbiBhIGh0dHAgcmVxdWVzdCwgcmF0aGVyIHRoYW4gcmVjcmVhdGluZyB0aGlzIGZpbGUgZm9y IGV2ZXJ5IHJlcXVlc3QgdGhhdCBjb21lcyB0aHJvdWdoLiAgSSdtIGxpbmtpbmcgdGhlIHJlcXVl c3RzIGRldGFpbHMgdG8gdGhlIGZpbGUgdXNpbmcgYW4gZW50cnkgaW4gdGhlIGNhY2hlLiAgV2hl biBhIHJlcXVlc3QgY29tZXMgaW4gSSBjaGVjayB0aGUgY2FjaGUgZm9yIHRoZSByZXF1ZXN0IGFu ZCBmZXRjaCB0aGUgZGV0YWlscyBvZiB0aGUgZmlsZS4gIElmIHRoZSBmaWxlIGlzIGRlbGV0ZWQg SSB3YW50IHRoZSBlbnRyeSByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHNvIGl0IGdldHMgcmVjcmVh dGVkLiAgTXkgcHJvYmxlbSBpcyB0aGUgZmlsZSBpcyBzb21ldGltZXMgYmVpbmcgZGVsZXRlZCBp bW1lZGlhdGVseSBhZnRlciBpdHMgYWRkZWQgdG8gdGhlIGNhY2hlIGJlY2F1c2UgdGhlIGNhY2hl IGZyYW1ld29yayB0aGlua3MgdGhlIGZpbGUgaGFzIGNoYW5nZWQuICBJJ3ZlIGF0dGVtcHRlZCB0 byB1c2UgdGhlIGRlbGF5IHRvIHRyeSBhbmQgYXZvaWQgdGhpcyBjb25mdXNpb24uLi4uLiB3aXRo IG5vIHN1Y2Nlc3MuDQoNCgkJLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCgkJRnJvbTogRmVk dWtlIENudHIgQ2hhcmxlcyBSIFttYWlsdG86RmVkdWtlQ1JAbWNzYy51c21jLm1pbF0NCgkJU2Vu dDogU2F0dXJkYXksIDE1IEp1bmUgMjAwMiAxMjowMCBBTQ0KCQlUbzogYXNwbmdlc2NhbGF0ZQ0K CQlTdWJqZWN0OiBbYXNwbmdlc2NhbGF0ZV0gUkU6IENhY2hlIGRlcGVuZGVuY2llcyBCVUcuLi4u IE9ORSBMQVNUIEZJTkFMIEFUVEVNUFQgVE8gR0VUIEFOIEFOU1dFUg0KCQkNCgkJDQoJCUkndmUg YmVlbiByZWFkaW5nIHRoaXMgY2FjaGUgdGhyZWFkIGFuZCB0aGUgbGFjayBvZiBhbnN3ZXJzIGZv ciBpdC4gIFRoaXMgZ290IG1lIHRoaW5raW5nLCBiZWNhdXNlIG9idmlvdXNseSBJIG11c3QgYmUg aW1wbGVtZW50aW5nIHRoZSBjYWNoZSB3cm9uZywgd2h5IGRvZXMgdGhlIGNhY2hlIGxpbmsgdG8g ZmlsZXMgb24gZGlzayBpbiB0aGUgZmlyc3QgcGxhY2U/ICBJIHdyb3RlIGEgd3JhcHBlciBjbGFz cyBmb3IgbXkgQVNQLk5FVCBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgbG9hZCBhIGRhdGFzZXQgb24g cmVxdWVzdCB0byBpdCBpZiBpdHMgbm90IGFscmVhZHkgbG9hZGVkIGZyb20gdGhlIGNhY2hlIChy ZWxvYWQgaWYgbmVjZXNzYXJ5KSBhbmQgcmVhZHMgYWxsIHRoZSBTUUwgU2VsZWN0IHN0YXRlbWVu dCBmcm9tIGEgKi54bWwgZmlsZSBJIHdyb3RlIHdoZW4gcmVxdWVzdGVkLiAgV2hhdCdzIHRoZSBy aWdodCB3YXkgdG8gdXNlIHRoZSBjYWNoZT8NCgkJIA0KCQktIENodWNrDQoNCgkJCS0tLS0tT3Jp Z2luYWwgTWVzc2FnZS0tLS0tDQoJCQlGcm9tOiBQYXVsIEQuIE11cnBoeSBbbWFpbHRvOnBtdXJw aHlAZGV2ZWxvcGluZ2RvdHMuY29tXQ0KCQkJU2VudDogVGh1cnNkYXksIEp1bmUgMTMsIDIwMDIg NjozNCBQTQ0KCQkJVG86IGFzcG5nZXNjYWxhdGUNCgkJCVN1YmplY3Q6IFthc3BuZ2VzY2FsYXRl XSBSRTogQ2FjaGUgZGVwZW5kZW5jaWVzIEJVRy4uLi4gT05FIExBU1QgRklOQUwgQVRURU1QVCBU TyBHRVQgQU4gQU5TV0VSDQoJCQkNCgkJCQ0KDQoJCQlJJ20gbm90IHNwZW5kaW5nIHRpbWUgb24g dGhlIGNhY2hlIGxpc3QgYW55bW9yZSwgYnV0IHlvdSBtaWdodCB3YW50IHRvIGhpdCB0aGUgbmV3 cyBhcmNoaXZlcyBhbmQgcGVlayBvdXQgUm9iIEhvd2FyZHMgcG9zdHMuIEkgdGhpbmstLSB0aGlz IGNvdWxkIGJlIGJhZCBpbmZvcm1hdGlvbiAtIHRoYXQgdGhlcmUgYXJlIHNvbWUgaGV1cmlzdGlj cyBpbiB0aGUgY2FjaGUgdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0b3RhbCBjb250cm9sIG92ZXIgdGhh dCB3aWxsIGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQgcmVsZWFzZSB5b3VyIG9iamVjdHMg ZWFybHkuIEkgYmVsaWV2ZSBSb2IgbWFkZSBhIHBvc3QgdGhhdCBkZXNjcmliZWQgdGhpcyBhdCBv bmUgcG9pbnQgaW4gdGltZS4gQWdhaW4sIEknbSBnb2luZyBlbnRpcmVseSBvZmYgb2YgbWVtb3J5 IGFuZCBSb2JzIHBvc3QgbWlnaHQgaGF2ZSBiZWVuIGFib3V0IGEgY29tcGxldGVseSBkaWZmZXJl bnQgaXNzdWUuDQoNCgkJCSANCg0KCQkJSSdtIGN1cmlvdXMgYWJvdXQgeW91ciB0ZXN0aW5nIGVu dmlyb25tZW50LiBBcmUgeW91IHRlc3RpbmcgdGhlIGNvZGUgdW5kZXIgdGhlIGV4dHJlbWUgbG9h ZCB0aGUgYXBwbGljYXRpb24gd2lsbCBkZW1hbmQ/IE9yIG9uIHlvdXIgd29ya3N0YXRpb24/IFRo ZSBkaWZmZXJlbmNlIGluIHRoZSBsb2FkIG1pZ2h0IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBwZXJm b3JtYW5jZSBpZiBteSBtZW1vcnkgaXMgY29ycmVjdC4NCg0KCQkJIA0KDQoJCQkgDQoNCgkJCVBh dWwNCg0KCQkJIA0KDQoJCQkgDQoNCgkJCSANCg0KCQkJLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0t LS0NCgkJCUZyb206IE1pY2hhZWwgW21haWx0bzptbGFuZ0BtaWNoYWVsbGFuZy5jb20uYXVdIA0K CQkJU2VudDogVGh1cnNkYXksIEp1bmUgMTMsIDIwMDIgMTA6MDUgQU0NCgkJCVRvOiBhc3BuZ2Vz Y2FsYXRlDQoJCQlTdWJqZWN0OiBbYXNwbmdlc2NhbGF0ZV0gQ2FjaGUgZGVwZW5kZW5jaWVzIEJV Ry4uLi4gT05FIExBU1QgRklOQUwgQVRURU1QVCBUTyBHRVQgQU4gQU5TV0VSDQoNCgkJCSANCg0K CQkJVGhpcyBoYXMgYmVlbiBwb3N0ZWQgdG8gdHdpY2UgdG8gYXNwbmdlc2NhbGF0ZSwgdHdpY2Ug dG8gYXNwbmdmcmVlZm9yYWxsIA0KCQkJYW5kIG9uY2UgdG8gYXNwbmdjYWNoZSB3aXRob3V0IGEg c2F0aXNmYWN0b3J5IHJlcGx5LiAgSSBndWVzcyB5b3UgZ3V5cyBtdXN0IGFsbCBiZSBvbiBob2xp ZGF5cy4NCg0KCQkJIA0KDQoJCQlJJ20gaGF2aW5nIHNvbWUgdHJvdWJsZXMgd2l0aCB0aGUgYXBw bGljYXRpb24gY2FjaGUuICBJIHVzZSB0aGUgZm9sbG93aW5nDQoJCQlsaW5lIG9mIGNvZGUgdG8g YWRkIGFuIGVudHJ5IHRvIHRoZSBjYWNoZQ0KDQoJCQkgDQoNCgkJCUNvbnRleHQuQ2FjaGUuQWRk KGNhY2hlS2V5LCBmaWxlSW5mbywgbmV3IENhY2hlRGVwZW5kZW5jeShmaWxlcGF0aCwNCgkJCURh dGVUaW1lLk5vdy5BZGRNaW51dGVzKDEpKSwgQ2FjaGUuTm9BYnNvbHV0ZUV4cGlyYXRpb24sDQoJ CQlUaW1lU3Bhbi5Gcm9tTWludXRlcygyMCksIENhY2hlSXRlbVByaW9yaXR5Lk5vdFJlbW92YWJs ZSwgb25SZW1vdmVGaWxlKTsNCg0KCQkJIA0KDQoJCQlGaXJzdCBJIGNyZWF0ZSBhIGZpbGUgYW5k IHRoZW4gSSBjYWNoZSBhbiBvYmplY3QgImZpbGVJbmZvIiB3aGljaCBjb250YWlucw0KCQkJaW5m b3JtYXRpb24gYWJvdXQgdGhpcyBmaWxlLiAgSWYgdGhlIGZpbGUgaXMgZGVsZXRlZCBJJ2QgbGlr ZSB0aGUgZW50cnkgaW4NCgkJCXRoZSBjYWNoZSByZWxhdGluZyB0byB0aGlzIGZpbGUgcmVtb3Zl ZCwgaGVuY2UgdGhlIGFkZGl0aW9uIG9mIHRoZQ0KCQkJZGVwZW5kZW5jeS4gIE15IHByb2JsZW0g aXMgdGhhdCBmcmVxdWVudGx5IHRoZSBlbnRyeSBpcyBiZWluZyByZW1vdmVkDQoJCQlpbW1lZGlh dGVseSB3aXRoIHRoZSByZWFzb24gIkRlcGVuZGVuY3lDaGFuZ2VkIi4NCg0KCQkJIA0KDQoJCQlJ IGRvbnQgdW5kZXJzdGFuZCB3aHkgdGhpcyBpcyBhcyBpdCBzaG91bGRuJ3QgZXZlbiBiZSB0cmFj a2luZyBjaGFuZ2VzIHRvDQoJCQl0aGUgZmlsZSBmb3IgYSBtaW51dGUuICBJZiBJIG1ha2UgdGhl IHRocmVhZCBzbGVlcCBmb3IgNDAwbXMgYmVmb3JlIGFkZGluZw0KCQkJYW4gZW50cnkgdG8gdGhl IGNhY2hlLCB0aGUgZW50cnkgaXMgbm90IGJlaW5nIHJlbW92ZWQgKHRoaXMgYnR3IGlzIGFuDQoJ CQl1bmFjY2VwdGFibGUgc29sdXRpb24gYXMgaXQgaXMgbm90IHJvYnVzdCBhbmQgc3BlZWQgaW4g dGhpcyBhcHAgaXMNCgkJCWNyaXRpY2FsKS4gIEkgc3VzcGVjdCB0aGUgZmlsZSBzeXN0ZW0gaGFz bid0IGZpbmlzaGVkIHdyaXRpbmcgdGhlIGZpbGUgYXQNCgkJCXRoZSB0aW1lIGl0J3MgaW5mb3Jt YXRpb24gaXMgYWRkZWQgdG8gdGhlIGNhY2hlLCBpdCBzZWVtcyBsaWtlIHRoZSBzdGFydA0KCQkJ dGltZSBmb3IgdHJhY2tpbmcgaXMgYmVpbmcgaWdub3JlZC4gIElzIHRoaXMgYSBidWcgPw0KDQoJ CQkgDQoNCgkJCVNlY29uZGx5IG15IG90aGVyIGdyaXBlIHdpdGggdGhlIENhY2hlIGNsYXNzIGlz IHRoYXQgZW50cmllcyB0aGF0IGRvIHN1cnZpdmUNCgkJCWRvbnQgc2VlbSB0byBiZSBzdGF5aW5n IGluIHRoZSBjYWNoZSBhbnl3aGVyZSBuZWFyIHRoZSAyMCBtaW51dGVzIEkndmUgc2V0LA0KCQkJ bW9yZSBsaWtlIDItNCBtaW51dGVzLCB3aXRoIHRoZSByZWFzb24gIlVuZGVydXNlZCIsIGFnYWlu IEkgZG9udCBxdWl0ZQ0KCQkJdW5kZXJzdGFuZCB0aGlzIGJlY2F1c2UgaXQgc2VlbXMgdG8gYmUg b2NjdXJpbmcgZXZlbiB3aGVuIHRlc3Rpbmcgd2l0aCBhDQoJCQlzaW5nbGUgaXRlbSBpbiB0aGUg Y2FjaGUgd2hpY2ggaXMgYmVpbmcgdXNlZCBjb250aW51b3VzbHkuDQoNCgkJCSANCg0KCQkJSGFz IGFueW9uZSBlbHNlIGV4cGVyaWVuY2VkIGFueSBvZiB0aGVzZSBwcm9ibGVtcyBoYXZlIGFuIGV4 cGxhbmF0aW9uDQoJCQlhbmQvb3IgYSB3b3JrYXJvdW5kID8NCg0KCQkJd2ViZm9ybTEuYXNweDot DQoNCgkJCSANCg0KCQkJPCVAIFBhZ2UgbGFuZ3VhZ2U9ImMjIiBDb2RlYmVoaW5kPSJXZWJGb3Jt MS5hc3B4LmNzIiBBdXRvRXZlbnRXaXJldXA9ImZhbHNlIg0KCQkJSW5oZXJpdHM9IkFudGlxdWVT aG9wLldlYkZvcm0xIiAlPg0KCQkJPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBI VE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIiA+DQoJCQk8SFRNTD4NCgkJCSA8SEVBRD4NCgkJCSAg PHRpdGxlPldlYkZvcm0xPC90aXRsZT4NCgkJCSAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBDb250 ZW50PSJNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA3LjAiPg0KCQkJICA8bWV0YSBuYW1lPSJDT0RF X0xBTkdVQUdFIiBDb250ZW50PSJDIyI+DQoJCQkgIDxtZXRhIG5hbWU9InZzX2RlZmF1bHRDbGll bnRTY3JpcHQiIGNvbnRlbnQ9IkphdmFTY3JpcHQiPg0KCQkJICA8bWV0YSBuYW1lPSJ2c190YXJn ZXRTY2hlbWEiDQoJCQljb250ZW50PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2ludGVs bGlzZW5zZS9pZTUiPg0KCQkJIDwvSEVBRD4NCgkJCSA8Ym9keSBNU19QT1NJVElPTklORz0iR3Jp ZExheW91dCI+DQoJCQkgIDxmb3JtIGlkPSJXZWJGb3JtMSIgbWV0aG9kPSJwb3N0IiBydW5hdD0i c2VydmVyIj4NCgkJCSAgIDxhc3A6QnV0dG9uIGlkPSJCdXR0b24xIiBzdHlsZT0iWi1JTkRFWDog MTAxOyBMRUZUOiAzMjNweDsgUE9TSVRJT046DQoJCQlhYnNvbHV0ZTsgVE9QOiAxODBweCIgcnVu YXQ9InNlcnZlciIgVGV4dD0iQnV0dG9uIj48L2FzcDpCdXR0b24+DQoJCQkgICA8YXNwOkxhYmVs IGlkPSJMYWJlbDEiIHN0eWxlPSJaLUlOREVYOiAxMDI7IExFRlQ6IDMyMHB4OyBQT1NJVElPTjoN CgkJCWFic29sdXRlOyBUT1A6IDc0cHgiIHJ1bmF0PSJzZXJ2ZXIiIFdpZHRoPSIzNTRweCI+TGFi ZWw8L2FzcDpMYWJlbD4NCgkJCSAgPC9mb3JtPg0KCQkJIDwvYm9keT4NCgkJCTwvSFRNTD4NCg0K CQkJIA0KDQoJCQl1c2luZyBTeXN0ZW07DQoJCQl1c2luZyBTeXN0ZW0uV2ViOw0KCQkJdXNpbmcg U3lzdGVtLldlYi5VSTsNCgkJCXVzaW5nIFN5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHM7DQoJCQl1 c2luZyBTeXN0ZW0uV2ViLkNhY2hpbmc7DQoJCQl1c2luZyBTeXN0ZW0uVGV4dDsNCgkJCXVzaW5n IFN5c3RlbS5JTzsNCg0KCQkJIA0KDQoJCQluYW1lc3BhY2UgQW50aXF1ZVNob3ANCgkJCXsNCgkJ CSAvLy8gPHN1bW1hcnk+DQoJCQkgLy8vIFN1bW1hcnkgZGVzY3JpcHRpb24gZm9yIFdlYkZvcm0x Lg0KCQkJIC8vLyA8L3N1bW1hcnk+DQoJCQkgcHVibGljIGNsYXNzIFdlYkZvcm0xIDogU3lzdGVt LldlYi5VSS5QYWdlDQoJCQkgew0KCQkJICBwcm90ZWN0ZWQgY2xhc3MgQUZpbGVJbmZvDQoJCQkg IHsNCgkJCSAgIHB1YmxpYyBzdHJpbmcgZmlsZU5hbWU7DQoJCQkgICBwdWJsaWMgc3RyaW5nIHBh dGg7DQoJCQkgIH0NCg0KCQkJIA0KDQoJCQkgIHByb3RlY3RlZCBTeXN0ZW0uV2ViLlVJLldlYkNv bnRyb2xzLkJ1dHRvbiBCdXR0b24xOw0KCQkJICBwcm90ZWN0ZWQgU3lzdGVtLldlYi5VSS5XZWJD b250cm9scy5MYWJlbCBMYWJlbDE7DQoJCQkgIHByaXZhdGUgQ2FjaGVJdGVtUmVtb3ZlZENhbGxi YWNrIG9uUmVtb3ZlRmlsZSA9IG51bGw7DQoJCQkgIHN0YXRpYyBpbnQgY291bnQgPSAwOw0KDQoJ CQkgDQoNCgkJCSAgcHJpdmF0ZSB2b2lkIFBhZ2VfTG9hZChvYmplY3Qgc2VuZGVyLCBTeXN0ZW0u RXZlbnRBcmdzIGUpDQoJCQkgIHsNCgkJCSAgIG9uUmVtb3ZlRmlsZSA9IG5ldyBDYWNoZUl0ZW1S ZW1vdmVkQ2FsbGJhY2soUmVtb3ZlQ2FjaGVkRmlsZUNhbGxiYWNrKTsNCgkJCSAgfQ0KDQoJCQkg DQoNCgkJCSAgI3JlZ2lvbiBXZWIgRm9ybSBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KCQkJICBv dmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBPbkluaXQoRXZlbnRBcmdzIGUpDQoJCQkgIHsNCgkJCSAg IC8vDQoJCQkgICAvLyBDT0RFR0VOOiBUaGlzIGNhbGwgaXMgcmVxdWlyZWQgYnkgdGhlIEFTUC5O RVQgV2ViIEZvcm0gRGVzaWduZXIuDQoJCQkgICAvLw0KCQkJICAgSW5pdGlhbGl6ZUNvbXBvbmVu dCgpOw0KCQkJICAgYmFzZS5PbkluaXQoZSk7DQoJCQkgIH0NCg0KCQkJIA0KDQoJCQkgIC8vLyA8 c3VtbWFyeT4NCgkJCSAgLy8vIFJlcXVpcmVkIG1ldGhvZCBmb3IgRGVzaWduZXIgc3VwcG9ydCAt IGRvIG5vdCBtb2RpZnkNCgkJCSAgLy8vIHRoZSBjb250ZW50cyBvZiB0aGlzIG1ldGhvZCB3aXRo IHRoZSBjb2RlIGVkaXRvci4NCgkJCSAgLy8vIDwvc3VtbWFyeT4NCgkJCSAgcHJpdmF0ZSB2b2lk IEluaXRpYWxpemVDb21wb25lbnQoKQ0KCQkJICB7DQoJCQkgICB0aGlzLkJ1dHRvbjEuQ2xpY2sg Kz0gbmV3IFN5c3RlbS5FdmVudEhhbmRsZXIodGhpcy5CdXR0b24xX0NsaWNrKTsNCgkJCSAgIHRo aXMuTG9hZCArPSBuZXcgU3lzdGVtLkV2ZW50SGFuZGxlcih0aGlzLlBhZ2VfTG9hZCk7DQoNCgkJ CSANCg0KCQkJICB9DQoJCQkgICNlbmRyZWdpb24NCg0KCQkJIA0KDQoJCQkgIHByaXZhdGUgdm9p ZCBCdXR0b24xX0NsaWNrKG9iamVjdCBzZW5kZXIsIFN5c3RlbS5FdmVudEFyZ3MgZSkNCgkJCSAg ew0KCQkJICAgc3RyaW5nIHRlc3RGaWxlID0gInRlc3RpdCIgKyBjb3VudC5Ub1N0cmluZygpICsg Ii50eHQiOw0KCQkJICAgc3RyaW5nIGZpbGVwYXRoID0gTWFwUGF0aCh0ZXN0RmlsZSk7DQoNCgkJ CSANCg0KCQkJICAgQUZpbGVJbmZvIGFmaWxlSW5mbyA9IG5ldyBBRmlsZUluZm8oKTsNCgkJCSAg IGFmaWxlSW5mby5maWxlTmFtZSA9IFBhdGguR2V0RmlsZU5hbWUodGVzdEZpbGUpOw0KCQkJICAg YWZpbGVJbmZvLnBhdGggPSBmaWxlcGF0aDsNCg0KCQkJIA0KDQoJCQkgICBDYWNoZS5BZGQoY291 bnQuVG9TdHJpbmcoKSwgYWZpbGVJbmZvLCBuZXcgQ2FjaGVEZXBlbmRlbmN5KGZpbGVwYXRoLA0K CQkJICAgICAgRGF0ZVRpbWUuTm93LkFkZE1pbnV0ZXMoMSkpLCBDYWNoZS5Ob0Fic29sdXRlRXhw aXJhdGlvbiwNCgkJCSAgICAgVGltZVNwYW4uRnJvbU1pbnV0ZXMoMjApLCBDYWNoZUl0ZW1Qcmlv cml0eS5Ob3RSZW1vdmFibGUsDQoJCQlvblJlbW92ZUZpbGUpOw0KDQoJCQkgDQoNCgkJCSAgIEZp bGVTdHJlYW0gdGVzdFN0cmVhbSA9IEZpbGUuT3BlbihmaWxlcGF0aCwgRmlsZU1vZGUuT3Blbk9y Q3JlYXRlKTsNCgkJCSAgIGJ5dGUgW10gdGVzdGJ5dGVzID0NCgkJCVVuaWNvZGVFbmNvZGluZy5V bmljb2RlLkdldEJ5dGVzKERhdGVUaW1lLk5vdy5Ub1N0cmluZygpKTsNCgkJCSAgIHRlc3RTdHJl YW0uV3JpdGUodGVzdGJ5dGVzLCAwLCB0ZXN0Ynl0ZXMuTGVuZ3RoKTsNCgkJCSAgIHRlc3RTdHJl YW0uQ2xvc2UoKTsNCg0KCQkJIA0KDQoJCQkgICArK2NvdW50Ow0KCQkJICB9DQoNCgkJCSANCg0K CQkJICBwcml2YXRlIHZvaWQgUmVtb3ZlQ2FjaGVkRmlsZUNhbGxiYWNrKHN0cmluZyBrLCBvYmpl Y3QgdiwNCgkJCUNhY2hlSXRlbVJlbW92ZWRSZWFzb24gcikNCgkJCSAgew0KCQkJICAgdHJ5DQoJ CQkgICB7DQoJCQkgICAgQUZpbGVJbmZvIGFmaWxlSW5mbyA9IChBRmlsZUluZm8pdjsNCgkJCSAg ICBpZiAoYWZpbGVJbmZvICE9IG51bGwpDQoJCQkgICAgIEZpbGUuRGVsZXRlKGFmaWxlSW5mby5w YXRoKTsNCgkJCSAgIH0NCgkJCSAgIGNhdGNoKEV4Y2VwdGlvbiBlKQ0KCQkJICAgew0KCQkJICAg IExhYmVsMS5UZXh0ID0gZS5NZXNzYWdlOw0KCQkJICAgfQ0KCQkJICB9DQoNCgkJCSB9DQoJCQl9 DQoNCgkJCU1pY2hhZWwgTGFuZw0KCQkJDQoNCgkJCU1TIC5ORVQgRGV2ZWxvcGVyDQoJCQlQaDog KzYxIDQgMTc0OTg2MjANCgkJCXd3dy5taWNoYWVsbGFuZy5jb20uYXUgPGh0dHA6Ly93d3cubWlj aGFlbGxhbmcuY29tLmF1Lz4gIA0KDQoJCQkNCg0KCQkJIA0KDQoJCQl8IFthc3BuZ2VzY2FsYXRl XSBtZW1iZXIgcG11cnBoeUBkZXZlbG9waW5nZG90cy5jb20gPSBZT1VSIElEIHwgaHR0cDovL3d3 dy5hc3BsaXN0cy5jb20vYXNwbGlzdHMvYXNwbmdlc2NhbGF0ZS5hc3AgPSBKT0lOL1FVSVQgDQoN CgkJCXwgW2FzcG5nZXNjYWxhdGVdIG1lbWJlciBmZWR1a2VjckBtY3NjLnVzbWMubWlsID0gWU9V UiBJRCB8IGh0dHA6Ly93d3cuYXNwbGlzdHMuY29tL2FzcGxpc3RzL2FzcG5nZXNjYWxhdGUuYXNw ID0gSk9JTi9RVUlUIA0KDQoJCXwgW2FzcG5nZXNjYWxhdGVdIG1lbWJlciBkYXJrbGluZ0BvemVt YWlsLmNvbS5hdSA9IFlPVVIgSUQgfCBodHRwOi8vd3d3LmFzcGxpc3RzLmNvbS9hc3BsaXN0cy9h c3BuZ2VzY2FsYXRlLmFzcCA9IEpPSU4vUVVJVCANCg0KCXwgW2FzcG5nZXNjYWxhdGVdIG1lbWJl ciBtZ2FyaW5zQGUtaW50ZXJzZWN0LmNvbSA9IFlPVVIgSUQgfCBodHRwOi8vd3d3LmFzcGxpc3Rz LmNvbS9hc3BsaXN0cy9hc3BuZ2VzY2FsYXRlLmFzcCA9IEpPSU4vUVVJVCA8IC9CTE9DS1FVT1RF ID4gDQoNCg=
|
|
| |
|
| |
| Michael |
I've not used the FileSystemWatcher class before but it appears that it's not going to help me as it's docs suggest it's intended to be used to monitor directories where as I would need it to observe individual files.
I already have a simple work around for this and that is to fetch it's details from the cache the do a System.IO.File.Exists and recreate the file if it has been deleted. This however is extremely ineffecient as I'm now doing extra disk access on every request, which from my measurements is causing up to a 30% degradation in performance, from the solution which uses the cache's file dependencies functionality (which is only working sometimes).... I'm far from happy with this solution.
I'm surprised that writting my own cache api is the most sensible solution here. I think the ASP.NET Cache api is a close match to what I need (especially if it functioned as expected).
I basically want the processing for a request to be cached for a period of time and in the normal course the Cache itself to decide when a file is deleted, however I would like the to be able to force a refresh by manually removing files, hence the attempted use of dependencies. The only difference between my requirements and those of the more common scenario is that I wish to store only the details of my data and not the data itself in the cache.... this is mainly because of the size of the data and the number of requests which makes storing it directly in the cache too much of a burden on system memory.
I still haven't actually had anyone say that they too can repeat the behaviour I've described and that they believe it is a bug. If I'm misunderstanding something here I would definitely like to know what it is.
-----Original Message----- From: Martin Garins [mailto:Click here to reveal e-mail address] Sent: Sunday, 16 June 2002 5:56 AM To: aspngescalate Subject: RE: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I would think rather than using the built in cache mechanism which was not really designed for your purpose. You should look at writing your own structure and and use the filesystem watcher object to watch for changes to files and remove or add them you your own cache as needed.
If I was trying to do what I think you are trying to do this is how I would do it.
Marty
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Sat 6/15/2002 10:37 AM To: aspngescalate Cc: Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
It's simply a means of triggering removal of a cache entry based on the date and time stamp of the file. I think the idea behind linking cache entries to the date time stamp on a file is to cater for a common scenario where you fetch the data from the cache and if it is not found in the cache reload it from a file. In my instance I'm doing things a little differently. I'm creating a file based on a http request, rather than recreating this file for every request that comes through. I'm linking the requests details to the file using an entry in the cache. When a request comes in I check the cache for the request and fetch the details of the file. If the file is deleted I want the entry removed from the cache so it gets recreated. My problem is the file is sometimes being deleted immediately after its added to the cache because the cache framework thinks the file has changed. I've attempted to use the delay to try and avoid this confusion..... with no success.
-----Original Message----- From: Feduke Cntr Charles R [mailto:Click here to reveal e-mail address] Sent: Saturday, 15 June 2002 12:00 AM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I've been reading this cache thread and the lack of answers for it. This got me thinking, because obviously I must be implementing the cache wrong, why does the cache link to files on disk in the first place? I wrote a wrapper class for my ASP.NET application that will load a dataset on request to it if its not already loaded from the cache (reload if necessary) and reads all the SQL Select statement from a *.xml file I wrote when requested. What's the right way to use the cache?
- Chuck
-----Original Message----- From: Paul D. Murphy [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 6:34 PM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I'm not spending time on the cache list anymore, but you might want to hit the news archives and peek out Rob Howards posts. I think-- this could be bad information - that there are some heuristics in the cache that you don't have total control over that will depending on the environment release your objects early. I believe Rob made a post that described this at one point in time. Again, I'm going entirely off of memory and Robs post might have been about a completely different issue.
I'm curious about your testing environment. Are you testing the code under the extreme load the application will demand? Or on your workstation? The difference in the load might have an impact on the performance if my memory is correct.
Paul
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 10:05 AM To: aspngescalate Subject: [aspngescalate] Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
This has been posted to twice to aspngescalate, twice to aspngfreeforall and once to aspngcache without a satisfactory reply. I guess you guys must all be on holidays.
I'm having some troubles with the application cache. I use the following line of code to add an entry to the cache
Context.Cache.Add(cacheKey, fileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
First I create a file and then I cache an object "fileInfo" which contains information about this file. If the file is deleted I'd like the entry in the cache relating to this file removed, hence the addition of the dependency. My problem is that frequently the entry is being removed immediately with the reason "DependencyChanged".
I dont understand why this is as it shouldn't even be tracking changes to the file for a minute. If I make the thread sleep for 400ms before adding an entry to the cache, the entry is not being removed (this btw is an unacceptable solution as it is not robust and speed in this app is critical). I suspect the file system hasn't finished writing the file at the time it's information is added to the cache, it seems like the start time for tracking is being ignored. Is this a bug ?
Secondly my other gripe with the Cache class is that entries that do survive dont seem to be staying in the cache anywhere near the 20 minutes I've set, more like 2-4 minutes, with the reason "Underused", again I dont quite understand this because it seems to be occuring even when testing with a single item in the cache which is being used continuously.
Has anyone else experienced any of these problems have an explanation and/or a workaround ?
webform1.aspx:-
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="AntiqueShop.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content=" http://schemas.microsoft.com/intellisense/ie5 <http://schemas.microsoft.com/intellisense/ie5> "> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 323px; POSITION: absolute; TOP: 180px" runat="server" Text="Button"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 320px; POSITION: absolute; TOP: 74px" runat="server" Width="354px">Label</asp:Label> </form> </body> </HTML>
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.Text; using System.IO;
namespace AntiqueShop { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected class AFileInfo { public string fileName; public string path; }
protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; private CacheItemRemovedCallback onRemoveFile = null; static int count = 0;
private void Page_Load(object sender, System.EventArgs e) { onRemoveFile = new CacheItemRemovedCallback(RemoveCachedFileCallback); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private void Button1_Click(object sender, System.EventArgs e) { string testFile = "testit" + count.ToString() + ".txt"; string filepath = MapPath(testFile);
AFileInfo afileInfo = new AFileInfo(); afileInfo.fileName = Path.GetFileName(testFile); afileInfo.path = filepath;
Cache.Add(count.ToString(), afileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
FileStream testStream = File.Open(filepath, FileMode.OpenOrCreate); byte [] testbytes UnicodeEncoding.Unicode.GetBytes(DateTime.Now.ToString()); testStream.Write(testbytes, 0, testbytes.Length); testStream.Close();
++count; }
private void RemoveCachedFileCallback(string k, object v, CacheItemRemovedReason r) { try { AFileInfo afileInfo = (AFileInfo)v; if (afileInfo != null) File.Delete(afileInfo.path); } catch(Exception e) { Label1.Text = e.Message; } }
} }
Michael Lang
MS .NET Developer Ph: +61 4 17498620 www.michaellang.com.au <http://www.michaellang.com.au/>
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT < /BLOCKQUOTE >
|
|
| |
|
| |
| Martin Garins |
The FileSystemWatcher can wathc Files and/or directories Here are the events
Public Events
public event<ms-help://MS.VSCC/MS.MSDNVS/cpref/html/pubevent.gif> Changed <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl asschangedtopic.htm> Occurs when a file or directory in the specified Path <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl asspathtopic.htm> is changed. public event<ms-help://MS.VSCC/MS.MSDNVS/cpref/html/pubevent.gif> Created <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl asscreatedtopic.htm> Occurs when a file or directory in the specified Path <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl asspathtopic.htm> is created. public event<ms-help://MS.VSCC/MS.MSDNVS/cpref/html/pubevent.gif> Deleted <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl assdeletedtopic.htm> Occurs when a file or directory in the specified Path <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl asspathtopic.htm> is deleted. public event<ms-help://MS.VSCC/MS.MSDNVS/cpref/html/pubevent.gif> Disposed <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemcomponentmodelcompone ntclassdisposedtopic.htm> (inherited from Component) Adds an event handler to listen to the Disposed <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemcomponentmodelcompone ntclassdisposedtopic.htm> event on the component. public event<ms-help://MS.VSCC/MS.MSDNVS/cpref/html/pubevent.gif> Error <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl asserrortopic.htm> Occurs when the internal buffer overflows. public event<ms-help://MS.VSCC/MS.MSDNVS/cpref/html/pubevent.gif> Renamed <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl assrenamedtopic.htm> Occurs when a file or directory in the specified Path <ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchercl asspathtopic.htm> is renamed.
This came directly from the documentaions here ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemiofilesystemwatchermem berstopic.htm
Martin Garins, MCSD Vice President - Technology e-Intersect Corp. http://www.e-intersect.com <http://www.e-intersect.com/> http://www.jppex.com <http://www.jppex.com/" target="_blank">http://www.jppex.com/>
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Sunday, June 16, 2002 8:30 PM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER I've not used the FileSystemWatcher class before but it appears that it's not going to help me as it's docs suggest it's intended to be used to monitor directories where as I would need it to observe individual files. I already have a simple work around for this and that is to fetch it's details from the cache the do a System.IO.File.Exists and recreate the file if it has been deleted. This however is extremely ineffecient as I'm now doing extra disk access on every request, which from my measurements is causing up to a 30% degradation in performance, from the solution which uses the cache's file dependencies functionality (which is only working sometimes).... I'm far from happy with this solution. I'm surprised that writting my own cache api is the most sensible solution here. I think the ASP.NET Cache api is a close match to what I need (especially if it functioned as expected). I basically want the processing for a request to be cached for a period of time and in the normal course the Cache itself to decide when a file is deleted, however I would like the to be able to force a refresh by manually removing files, hence the attempted use of dependencies. The only difference between my requirements and those of the more common scenario is that I wish to store only the details of my data and not the data itself in the cache.... this is mainly because of the size of the data and the number of requests which makes storing it directly in the cache too much of a burden on system memory. I still haven't actually had anyone say that they too can repeat the behaviour I've described and that they believe it is a bug. If I'm misunderstanding something here I would definitely like to know what it is. -----Original Message----- From: Martin Garins [mailto:Click here to reveal e-mail address] Sent: Sunday, 16 June 2002 5:56 AM To: aspngescalate Subject: RE: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I would think rather than using the built in cache mechanism which was not really designed for your purpose. You should look at writing your own structure and and use the filesystem watcher object to watch for changes to files and remove or add them you your own cache as needed. If I was trying to do what I think you are trying to do this is how I would do it. Marty
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Sat 6/15/2002 10:37 AM To: aspngescalate Cc: Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER It's simply a means of triggering removal of a cache entry based on the date and time stamp of the file. I think the idea behind linking cache entries to the date time stamp on a file is to cater for a common scenario where you fetch the data from the cache and if it is not found in the cache reload it from a file. In my instance I'm doing things a little differently. I'm creating a file based on a http request, rather than recreating this file for every request that comes through. I'm linking the requests details to the file using an entry in the cache. When a request comes in I check the cache for the request and fetch the details of the file. If the file is deleted I want the entry removed from the cache so it gets recreated. My problem is the file is sometimes being deleted immediately after its added to the cache because the cache framework thinks the file has changed. I've attempted to use the delay to try and avoid this confusion..... with no success.
-----Original Message----- From: Feduke Cntr Charles R [mailto:Click here to reveal e-mail address] Sent: Saturday, 15 June 2002 12:00 AM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER I've been reading this cache thread and the lack of answers for it. This got me thinking, because obviously I must be implementing the cache wrong, why does the cache link to files on disk in the first place? I wrote a wrapper class for my ASP.NET application that will load a dataset on request to it if its not already loaded from the cache (reload if necessary) and reads all the SQL Select statement from a *.xml file I wrote when requested. What's the right way to use the cache? - Chuck
-----Original Message----- From: Paul D. Murphy [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 6:34 PM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I'm not spending time on the cache list anymore, but you might want to hit the news archives and peek out Rob Howards posts. I think-- this could be bad information - that there are some heuristics in the cache that you don't have total control over that will depending on the environment release your objects early. I believe Rob made a post that described this at one point in time. Again, I'm going entirely off of memory and Robs post might have been about a completely different issue.
I'm curious about your testing environment. Are you testing the code under the extreme load the application will demand? Or on your workstation? The difference in the load might have an impact on the performance if my memory is correct.
Paul
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 10:05 AM To: aspngescalate Subject: [aspngescalate] Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
This has been posted to twice to aspngescalate, twice to aspngfreeforall and once to aspngcache without a satisfactory reply. I guess you guys must all be on holidays.
I'm having some troubles with the application cache. I use the following line of code to add an entry to the cache
Context.Cache.Add(cacheKey, fileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
First I create a file and then I cache an object "fileInfo" which contains information about this file. If the file is deleted I'd like the entry in the cache relating to this file removed, hence the addition of the dependency. My problem is that frequently the entry is being removed immediately with the reason "DependencyChanged".
I dont understand why this is as it shouldn't even be tracking changes to the file for a minute. If I make the thread sleep for 400ms before adding an entry to the cache, the entry is not being removed (this btw is an unacceptable solution as it is not robust and speed in this app is critical). I suspect the file system hasn't finished writing the file at the time it's information is added to the cache, it seems like the start time for tracking is being ignored. Is this a bug ?
Secondly my other gripe with the Cache class is that entries that do survive dont seem to be staying in the cache anywhere near the 20 minutes I've set, more like 2-4 minutes, with the reason "Underused", again I dont quite understand this because it seems to be occuring even when testing with a single item in the cache which is being used continuously.
Has anyone else experienced any of these problems have an explanation and/or a workaround ?
webform1.aspx:-
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="AntiqueShop.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 323px; POSITION: absolute; TOP: 180px" runat="server" Text="Button"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 320px; POSITION: absolute; TOP: 74px" runat="server" Width="354px">Label</asp:Label> </form> </body> </HTML>
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.Text; using System.IO;
namespace AntiqueShop { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected class AFileInfo { public string fileName; public string path; }
protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; private CacheItemRemovedCallback onRemoveFile = null; static int count = 0;
private void Page_Load(object sender, System.EventArgs e) { onRemoveFile = new CacheItemRemovedCallback(RemoveCachedFileCallback); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load);
} #endregion
private void Button1_Click(object sender, System.EventArgs e) { string testFile = "testit" + count.ToString() + ".txt"; string filepath = MapPath(testFile);
AFileInfo afileInfo = new AFileInfo(); afileInfo.fileName Path.GetFileName(testFile); afileInfo.path = filepath;
Cache.Add(count.ToString(), afileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
FileStream testStream File.Open(filepath, FileMode.OpenOrCreate); byte [] testbytes UnicodeEncoding.Unicode.GetBytes(DateTime.Now.ToString()); testStream.Write(testbytes, 0, testbytes.Length); testStream.Close();
++count; }
private void RemoveCachedFileCallback(string k, object v, CacheItemRemovedReason r) { try { AFileInfo afileInfo = (AFileInfo)v; if (afileInfo != null) File.Delete(afileInfo.path); } catch(Exception e) { Label1.Text = e.Message; } }
} }
Michael Lang
MS .NET Developer Ph: +61 4 17498620 www.michaellang.com.au <http://www.michaellang.com.au/>
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp = JOIN/QUIT
| [aspngescalate] member Click here to reveal e-mail address = YOUR ID | http://www.asplists.com/asplists/aspngescalate.asp JOIN/QUIT < /BLOCKQUOTE >
|
|
| |
|
| |
| Paul D. Murphy |
I really want to see you solve this issue and I think the best thing to do is get a firm understanding of what you are trying to do. I understand what the problem is with the cache, but I don't understand what you are trying to accomplish. That would help me greatly, understanding the goal of this process you are having trouble with.
Paul
|
|
| |
|
| |
| Michael |
I think caching it in RAM can be fine, as long as the amount of data is known. I'm caching to disk as the amount of data I need to cache is indeterminate and the process to create the data each time is costly. I've seen one other use for using dependencies even in the instance that the you're storing datasets directly in the cache and that is to get the cache to refetch the data from the database when it has been updated. This is accomplished by creating a trigger and updating a file in that trigger when the data in a table is changed, you then use a cache dependency to observe this file which will cause the entry in the cache to be removed when the table is updated..... pretty cool. You can find the full details of it here.
http://www.dotnetjunkies.com/tutorials.aspx?tutorialid=385
-----Original Message----- From: Feduke Cntr Charles R [mailto:Click here to reveal e-mail address] Sent: Monday, 17 June 2002 9:27 PM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
Ah, I think I understand now. This is why in these books I've read they always go into detail on storing the results of recordsets in XML files on disk and retrieving them from there. I think that my system is small enough that its realistic that I keep all of my lookup tables in the cache in RAM rather than in XML files on disk. However I've [obviously] never used the cache as it was intended so I can't offer any insite to your problem.
- Chuck -----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Saturday, June 15, 2002 11:37 AM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
It's simply a means of triggering removal of a cache entry based on the date and time stamp of the file. I think the idea behind linking cache entries to the date time stamp on a file is to cater for a common scenario where you fetch the data from the cache and if it is not found in the cache reload it from a file. In my instance I'm doing things a little differently. I'm creating a file based on a http request, rather than recreating this file for every request that comes through. I'm linking the requests details to the file using an entry in the cache. When a request comes in I check the cache for the request and fetch the details of the file. If the file is deleted I want the entry removed from the cache so it gets recreated. My problem is the file is sometimes being deleted immediately after its added to the cache because the cache framework thinks the file has changed. I've attempted to use the delay to try and avoid this confusion..... with no success. -----Original Message----- From: Feduke Cntr Charles R [mailto:Click here to reveal e-mail address] Sent: Saturday, 15 June 2002 12:00 AM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I've been reading this cache thread and the lack of answers for it. This got me thinking, because obviously I must be implementing the cache wrong, why does the cache link to files on disk in the first place? I wrote a wrapper class for my ASP.NET application that will load a dataset on request to it if its not already loaded from the cache (reload if necessary) and reads all the SQL Select statement from a *.xml file I wrote when requested. What's the right way to use the cache?
- Chuck -----Original Message----- From: Paul D. Murphy [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 6:34 PM To: aspngescalate Subject: [aspngescalate] RE: Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
I'm not spending time on the cache list anymore, but you might want to hit the news archives and peek out Rob Howards posts. I think-- this could be bad information - that there are some heuristics in the cache that you don't have total control over that will depending on the environment release your objects early. I believe Rob made a post that described this at one point in time. Again, I'm going entirely off of memory and Robs post might have been about a completely different issue.
I'm curious about your testing environment. Are you testing the code under the extreme load the application will demand? Or on your workstation? The difference in the load might have an impact on the performance if my memory is correct.
Paul
-----Original Message----- From: Michael [mailto:Click here to reveal e-mail address] Sent: Thursday, June 13, 2002 10:05 AM To: aspngescalate Subject: [aspngescalate] Cache dependencies BUG.... ONE LAST FINAL ATTEMPT TO GET AN ANSWER
This has been posted to twice to aspngescalate, twice to aspngfreeforall and once to aspngcache without a satisfactory reply. I guess you guys must all be on holidays.
I'm having some troubles with the application cache. I use the following line of code to add an entry to the cache
Context.Cache.Add(cacheKey, fileInfo, new CacheDependency(filepath, DateTime.Now.AddMinutes(1)), Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20), CacheItemPriority.NotRemovable, onRemoveFile);
First I create a file and then I cache an object "fileInfo" which contains information about this file. If the file is deleted I'd like the entry in the cache relating to this file removed, hence the addition of the dependency. My problem is that frequently the entry is being removed immediately with the reason "DependencyChanged".
I dont understand why this is as it shouldn't even be tracking changes to the file for a minute. If I make the thread sleep for 400ms before adding an entry to the cache, the entry is not being removed (this btw is an unacceptable solution as it is not robust and speed in this app is critical). I suspect the file system hasn't finished writing the file at the time it's information is added to the cache, it seems like the start time for tracking is being ignored. Is this a bug ?
Secondly my other gripe with the Cache class is that entries that do survive dont seem to be staying in the cache anywhere near the 20 minutes I've set, more like 2-4 minutes, with the reason "Underused", again I dont quite understand this because it seems to be occuring even when testing with a single item in the cache which is being used continuously.
Has anyone else experienced any of these problems have an explanation and/or a workaround ?
webform1.aspx:-
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="AntiqueShop.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 323px; POSITION: absolute; TOP: 180px" runat="server" Text="Button"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 320px; POSITION: absolute; TOP: 74px" runat="server" Width="354px">Label</asp:Label> </form> </body> </HTML>
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.Text; using System.IO;
| | |