|
I've got a testing application, that has about 57MB of memory usage with filled DataGridView. Now the GC only starts working at about 200MB. That's quite alot. I'd rather have an application using 57MB all the time, instead of always getting to 200MB before optimization starts to get it back to 57MB.
|
|
|
|
|
The .NET 2.0 Service Pack 1 adds some new APIs to help you control this behavior. Look up System.Runtime.GCSettings class.
|
|
|
|
|
I've got .NET Framework 2 SP1, and I don't see anything interesting in that class. All it has are these two properties:
// Gets a value indicating whether server garbage collection is enabled.
System.Runtime.GCSettings.IsServerGC
// Sets the behavior of the GC
System.Runtime.GCSettings.LatencyMode
The LatencyMode could be interesting, if it wouldn't only have these three unusable choices:
GCLatencyMode.Batch // for non-UI applications
GCLatencyMode.Interactive // for UI applications, used by default
GCLatencyMode.LowLatency // when you don't want the GC to interrupt time-sensitive operations
Nothing interesting there.
Edit: On MSDN it says this:
Use the Collect method when there is a significant reduction in the amount of memory being used at a defined point in your application's code. For example, if your application uses a complex dialog box that has several controls, calling Collect when the dialog box is closed could improve performance by immediately reclaiming the memory.
If they already think a complex dialog box is a good situation to collect garbage after with GC.Collect, I think a DataGridView with a hundred thousand rows that has been cleared is a good reason too. That's just my unexperienced opinion though.
modified on Tuesday, February 26, 2008 3:36 PM
|
|
|
|
|
You could try Batch to see if it solves anything, might be interesting to note.
FWIW, we've had a problem with the garbage collector here where our server app will use 500-700MB of memory before the garbage collector kicks in and brings it back down to 80MB. We've even had occassions where the app will be eating 1GB+ of memory and starts throwing OutOfMemoryExceptions until we force a GC. It's really insane. Unfortunately, the only way we were able to get around this is to force a GC key spots in the code. This isn't typical -- we've never seen the above issue on any other applications, so it may be a bug in our code somehow...
We shouldn't have to do this, and sometimes I wonder if the GC is being too lazy, or in the above case, not working at all.
Oddly, if I force 1 or 2 garbage collections, the GC seems able to handle everything from there on out.
I guess I'd recommend forcing a GC in rare scenarios like the one you describe above, where lots of memory suddenly is freed and should be collected immediately.
|
|
|
|
|
Alright, seems the GC isn't 100% perfect yet. Thanks for the reply.
|
|
|
|
|
Hi,
I have written code for sending mails using c#.I am facing the following problem with this.
Mail Body is not showing up for Meeting requests/mail received through Lotus Notes. The meeting request is shown correctly when viewed through the Outlook with the body showing up but not in Lotus Notes.
Plz help me...
Thanks in Advance
Alok...
|
|
|
|
|
It's difficult to help if you don't show us some code.
|
|
|
|
|
Here is the code i am using,
msg.From = new MailAddress(From);
msg.Subject = Subject;
msg.SubjectEncoding = System.Text.Encoding.Default;
StringBuilder strBodyText = new StringBuilder();
strBodyText.AppendLine(some string on logical criteria);
msg.Body = strBodyText.ToString();
msg.BodyEncoding = System.Text.Encoding.Default;
msg.IsBodyHtml = false;
msg.Priority = MailPriority.High;
SmtpClient client = new SmtpClient();
client.Port = 25;//or use 587
client.Host = smtpServer;
client.Send(msg);
|
|
|
|
|
Ok, looks pretty good to me. Do other applications have issues downloading these emails?
|
|
|
|
|
No I am facing this issue with Lotus Notes only.
|
|
|
|
|
Sounds like you need to talk to Lotus Notes support, given that you're code looks fine and it works with other email clients.
|
|
|
|
|
|
hey peeps
can someone please BRIEFLY explain the word "memory leak" to me?
ive come across something strange in a test app im writing, im communicating to a external device via LAN using an SDK provided by the manufacturer. The documentation keeps commenting parts of code "Critical! Without disposing, you'd have a memory leak."
what happens in my app is sometimes i close it but visual studio stays in debug mode? is this a memory leak?
thanx
Harvey Saayman - South Africa
Junior Developer
.Net, C#, SQL
think BIG and kick ASS
you.suck = (you.passion != Programming)
|
|
|
|
|
|
A memory leak means your program or library is allocating memory and never freeing it. Since the CLR managed memory for you, this shouldn't be an issue. But there are some things to watch out for:
if you you objects that implement IDisposable, you should call Dispose on them when you're done. Read up on IDisposable[^].
Another thing to watch out for is listening for events on live objects. Say you have an object that will be around for the program's duration, longLivingObject. It has an event called Changed on it. Now imagine you create 1,000,000 short lived objects during the duration of the program. Each one listens for the Changed event on longLivingObject. Now you'll have a leak: all the shortLivedObjects will stay in memory because the longLivedObject is holding a reference to each shortLivedObject through the event. longLivedObject is keeping the 1,000,000 short lived objects in memory.
|
|
|
|
|
Hi,
i have troubles with a C# wrapper for one of my libraries. The C declaration looks like this:
int find(void *h, void *reserved, key *key, record *record, int flags);
The function searches a database for "key" and, if successfully, fills "record" with the values. In C# record structure looks like this (the only important members are "size" and "data").
[StructLayout(LayoutKind.Sequential)]
unsafe struct RecordStruct
{
public Int32 size;
public void *data;
public Int32 flags;
public Int32 _flags;
public Int64 _rid;
}
And here is my C# function wrapper:
[DllImport("database.dll", EntryPoint = "find",
CallingConvention = CallingConvention.Cdecl)]
static private extern int FindLow(IntPtr handle, IntPtr reserved,
ref KeyStruct key, ref RecordStruct record, int flags);
static public unsafe byte[] Find(IntPtr handle, byte[] data, int flags) {
KeyStruct key = new KeyStruct();
RecordStruct record = new RecordStruct();
key.size = (short)data.GetLength(0);
fixed (byte* bk = data) {
key.data = bk;
int st = FindLow(handle, IntPtr.Zero, ref key, ref record, flags);
if (st == 0) {
return record.data;
}
throw new DatabaseException(st);
}
}
My problem is that RecordStruct.data is a void* byte array, and RecordStruct.size is the size of the array. But how can i create a C# byte[] from this pointer?
If possible, i would like to avoid copying the array contents, which would mean a huge performance penalty (but that would also mean that the void* pointer must not be moved around by the garbage collector...)
Thanks
Christoph
|
|
|
|
|
I am not sure about the following code block; but you can give a try
<br />
fixed (byte* bk = data)<br />
{<br />
key.data = bk;<br />
int st = FindLow(handle, IntPtr.Zero, ref key, ref record, flags);<br />
if (st == 0)<br />
{<br />
IntPtr recData = new IntPtr(record.data);<br />
byte[] newArray = new byte[record.size];<br />
Marshal.Copy(recData, newArray, 0, record.size);<br />
return newArray;<br />
}<br />
throw new DatabaseException(st);<br />
}<br />
Please check whether record.data has to be pinned or not.
*jaans
|
|
|
|
|
yes, it works Thanks for your help. I'm not happy about the copying, but i guess it can't be avoided.
How can i pin it? with fixed()?
|
|
|
|
|
hi ,
i only wanna run single exe for my application if second is tried to run
show a message only one exe can run in one time.
For C# there is a easy way for this?
|
|
|
|
|
Please use the search[^], there's loads of examples.
Standards are great! Everybody should have one!
|
|
|
|
|
Two ways that I know of.
1. Use a Mutex, a bit of googling should find you loads of examples - some better than others. Avoid ones that use the process name as if someone copies your exe and renames it they'll be able to run both instances.
2. Using the VisualBasic namespace, a bit of fiddling with Program.cs file and it works as VB has an easy way of setting it - but using VB always feels wrong (IMO) in C#
Dave
|
|
|
|
|
I create multiple pictureboxes on one big parent picturebox with following code:
void btn_transfo_MouseDown(object sender, MouseEventArgs e)<br />
{<br />
teller_transfo += 1;<br />
PictureBox transfo = new PictureBox();<br />
transfo.Name = "transfo" + teller_transfo;<br />
transfo.ClientSize = new Size(50, 50);<br />
transfo.SizeMode = PictureBoxSizeMode.StretchImage;<br />
try<br />
{<br />
transfo.Image = Image.FromFile(@"c:\pic\transfo.jpg");<br />
}<br />
catch (Exception error)<br />
{<br />
MessageBox.Show(error.Message, "Cannot find pic", MessageBoxButtons.OK, MessageBoxIcon.Error);<br />
}<br />
transfo.MouseDown += new MouseEventHandler(transfo_MouseDown);<br />
transfo.MouseUp += new MouseEventHandler(transfo_MouseUp);<br />
transfo.MouseMove += new MouseEventHandler(transfo_MouseMove);<br />
transfo.MouseDoubleClick += new MouseEventHandler(transfo_MouseDoubleClick);<br />
transfo.MouseClick += new MouseEventHandler(transfo_MouseRightClick);<br />
picCanvas.Controls.Add(transfo);<br />
this.DoDragDrop(transfo, DragDropEffects.Move);<br />
}
I have created a context menu on right click with this code:
void transfo_MouseRightClick(object sender, MouseEventArgs e)<br />
{<br />
if (e.Button == MouseButtons.Right)<br />
{<br />
PictureBox x = sender as PictureBox;<br />
cxt_Transfo.Show(x, new Point(e.X, e.Y));<br />
}<br />
}
This all works fine, no i have added a button in the context menu to remove the picturebox i right clicked on:
void cxt_btn_transfoVerwijder_MouseDown(object sender, MouseEventArgs e)<br />
{<br />
PictureBox x = sender as PictureBox; <br />
picCanvas.Controls.Remove(x);<br />
}
The picturebox does't get removed.. what do i wrong?
Thx
|
|
|
|
|
Hello,
Have you debugged it?
The problem is, that you handle the MouseDown of the Button, and then try to cast the sender (which is the Button) to a PictureBox.
I would say, that "PictureBox x" (in your "cxt_btn_transfoVerwijder_MouseDown") is "null".
Apart from that, you should also Dispose the Instance of the PictureBox and remove all other references.
P.S.: Naming an PictureBox "x" doesn't make it easy for us to help you!
All the best,
Martin
|
|
|
|
|
Hi,
Can someone tell me how to extract images and store it separately from an excel file using C# code?
Regards
Diptanil
|
|
|
|
|
If you try to extract a excel generated diagramm, the only chance is via screenshot. you cannot render the grafic without opening excel.
|
|
|
|
|