|
It seems unlikely that that is your problem, but you can check by keeping a permanent reference to your byte array within a class scope variable. For testing, this could be a static if it is difficult to get access to a globally available class instance.
I say unlikely, because I haven't heard of it before! It's the kind of things people have done for a long time, so I would expect a problem of this size to appear sooner than this. Could be though...
Real men don't use instructions. They are only the manufacturers opinion on how to put the thing together.
|
|
|
|
|
My application performs some data collection and store it in mem for display in detailed view e.g.
I use the Bitmap object with byte[] array filled with some pixels to store some image during data collection.
Only when my application consumes to the limits of available memory that gdiplus exception appear.
It means that byte[] array is released by GC.
If I allocate bitmap without external byte[] array that exception does not appear.
Чесноков
|
|
|
|
|
1.
If you don't mind temporarily having the data in memory twice, I would suggest you immediately create a second bitmap from the first, then delete the first and the byte array.
2.
You could also try and use a stream, however filling a MemoryStream with BMP data, then creating a Bitmap from the stream, isn't any better than the first approach.
3.
If you do mind the increased memory footprint and the copying cycles, I'm afraid you need explicit memory management for both the image and the array. The easiest would be to derive from Bitmap and keep the byte array pointer inside the derivative; unfortunately Bitmap is sealed. The next best approach IMO would be to have a static Dictionary<Bitmap, byte[]> where you keep the mapping alive for as long as (you think) the image lives. This of course would be a cooperative approach, as removing an image that is still in use somewhere would still be open to failure.
|
|
|
|
|
Are you allocating the byte[] array into the managed heap or into the unmanaged heap? This is crucial: if you allocate the array into the managed heap, the GC might reallocate it whenever it needs, and you'd have no control over it. When you use that constructor, the byte[] array should be allocated in the unmanaged heap (see Marshal.AllocHGlobal and Marshal.Copy methods), and remember to free that memory when you are done with your bitmap (see Marshal.FreeHGlobal).
|
|
|
|
|
Yes, I thought that Bitmap constructor keeps the reference to that managed byte[] array to prevent its deallocation. It is unnatural if that is not implemented as Bitmap will be invalid.
Чесноков
|
|
|
|
|
The bitmap doesn't know you gave it a "pointer to something that may move or even disappear"
You could use a GCHandle to pin the array
|
|
|
|
|
Have in mind that you are passing an IntPtr to the constructor, not a byte[] array. Having a static reference to the array in any other place wouldn't be a solution either, becouse when GC performs a garbage collection it also reallocates the objects in the managed heap, so if the array is reallocated the IntPtr passed wouldn't be already pointing to the array any more.
|
|
|
|
|
Hi guys need help
Currently i have an issue with of setting the printer to the crystal report.
i am using this code
ReportDocument.PrintOptions.PrinterName = "\\\\Server\\Printer Name";
ReportDocument.PrintToPrinter(1, false, 0, 0);
When i upload the website to the server And test from server. the printer can work
However if i test it and open up the website from client side. the printer dun seem to be working
Did i set my printer option correctly to connect to a network printer
Please advise
Thanks a million
KaKaShi HaTaKe
|
|
|
|
|
Take a deep look at this thread which I have answered on beginning of this year. It's a working one(at least for me last 4 years).
Crystal Report Direct Print[^]
thatraja |Chennai|India|
Brainbench certifications Univotes are like kid's kisses don't reject it Do what you want quickly because the Doomsday on 2012 My childhood story
|
|
|
|
|
Hi,
We have default parameters in C++ like at the time of function definition we can give some default value to a parameter. Is there anyhting similar in C#. Because when I gave like in the
below line it was giving me error in the C#, can I use this thing in the C#
public static void sample(int i=100, string s=string.Empty, bool b=true)
{
}
Thanks & Regards,
Md. Abdul Aleem
NIIT technologies
|
|
|
|
|
Default parameters have been added in .NET4 (I'm pretty sure) otherwise you'll have to supply the default in the calling method.
Regards,
Rob Philpott.
|
|
|
|
|
|
yep.
4.0 is what you want (and that may mean Visual Studio 2010!).
|
|
|
|
|
Ok. Thanks guys I am still using VS 2008 so it wont work for me.
Thanks & Regards,
Md. Abdul Aleem
NIIT technologies
|
|
|
|
|
You need to use .Net 4.0.
The funniest thing about this particular signature is that by the time you realise it doesn't say anything it's too late to stop reading it.
My latest tip/trick
Visit the Hindi forum here.
|
|
|
|
|
|
LOL, please say it again, just one more time
|
|
|
|
|
Done, but I've now run out of attributes -- how do you do blinking?
|
|
|
|
|
Of-course C# 4.0 , navigate the given link to get better clarification over optional parameter.
Click Me[^]
|
|
|
|
|
You can accomplish a similar effect by defining several versions of the same function, each with a different signature:
public static void sample(int i, string a)
{
bool b= true;
}
public static void sample(int i, bool b)
{
string s = string.Empty;
}
public static void sample(string a, bool b)
{
int i = 100;
}
etc...
If I remember my reading correctly, at run time the calling statement will be matched to the version with matching parameters, and the function will fill in the missing values with the predefined defaults.
Of course, I may be a complete idiot - I'm fairly new to C#. But it's what I would try if I really needed to do this.
Will Rogers never met me.
|
|
|
|
|
I usually implement that pattern as follows in C# 3.5:
public static void sample(int i, string a)
{
_sample(i,false,true,a);
}
public static void sample(int i, bool b)
_sample(i,false,b,string.Empty);
}
public static void sample(string a, bool b)
{
_sample(100,false,b,a);
}
private static void _sample(int i,bool a,bool b,string a_string)
{
}
Software Zen: delete this;
|
|
|
|
|
This is what I use, however I'll admit I feel it slopifies the code base....
I'd blame it on the Brain farts.. But let's be honest, it really is more like a Methane factory between my ears some days then it is anything else...
-----
"The conversations he was having with himself were becoming ominous."-.. On the radio...
|
|
|
|
|
You can use optional parameter .
you can this by this way
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Sum(1, 2, 3).ToString());
Console.WriteLine(Sum( 2, 3).ToString());
Console.ReadLine();
}
static int Sum(params int[] li)
{
int sum=0;
for ( int i = 0 ; i < li.Length ; i++ )
{
sum+=li[i];
}
return sum;
}
}
|
|
|
|
|
You've provided a way which can be only applicable to Integer, Try to expand it for all type of object passed in method.
Like instead of receiving data only in a array of int[], Receive it in object[]. and further check of every item in array whether it's bool,string,object of custom class,float,decimal.
That would be quite cumbersome, optional parameter is the good way , I guess.
|
|
|
|
|
Not exactly elegant but...
public static void sample(int i, string s, bool b)
{
if (i == default(int)) { i = 100; }
if (s == default(string)) { s = string.Empty; }
if (b == default(bool)) { b = true; }
}
Works in .NET Framework 3.5.
Kevin Rucker, Application Programmer
QSS Group, Inc.
United States Coast Guard OSC
Kevin.D.Rucker@uscg.mil
"Programming is an art form that fights back." -- Chad Hower
|
|
|
|