|
It does!
public class ProdTotalSales
{
public string Text { get; set; }
public int Value { get; set; }
public ProdTotalSales(string s, int i)
{
Text = s;
Value = i;
}
public override string ToString()
{
return string.Format("{0}:{1}", Value, Text);
}
}
ProdTotalSales p1 = new ProdTotalSales("P1", 1);
ProdTotalSales p2 = new ProdTotalSales("P2", 2);
List<ProdTotalSales> list = new List<ProdTotalSales>() { p1, p2 };
Console.WriteLine("Before:");
foreach (ProdTotalSales p in list) Console.WriteLine(p);
ProdTotalSales pn = list.First(p => p.Value == 2);
pn.Text = "P2 Modified";
Console.WriteLine("After:");
foreach (ProdTotalSales p in list) Console.WriteLine(p);
Before:
1:P1
2:P2
After:
1:P1
2:P2 Modified
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Well, I made the classic mistake of attaching too little code to my question, sorry about that. The thing is that my ProdTotalSales was declared as a struct. That meant that when I was debugging, the debugger showed ps.Antal=1 but salesLst[0].Antal=0 after executing the two rows of code above. I still dont understand how that could be. Now when I changed the ProdTotalSales into being a class, it works just fine. I would really appreciate an explanation to this. Could it have something to do with me calling the default-constructor?
The ProdTotalSales looked like this:
public struct ProdTotalSales
{
public int Year { get; set; }
public int Month { get; set; }
public int Antal { get; set; }
public ProdTotalSales(int _year, int _month, int _antal) : this()
{
Year = _year;
Month = _month;
Antal = _antal;
}
}
|
|
|
|
|
Ah! As you say, too little code!
The thing is that a struct is always a Value type, and a class a Reference type - which means that when you assign a struct instance to another variable you always get a copy, not a reference to the existing one - and it doesn't matter if you do it directly:
ProdTotalSales pn = list[0]
Or via a Linq method:
ProdTotalSales pn = list.First(p => p.Value == 2);
You always get a copy of the data, not a reference to the original item.
I wrote an article on the difference last year: Using struct and class - what's that all about?[^] which may help.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Yes, should have thought of that. I know the struct is a value typ, though didnt think of the implications of it. Thanks for the explanation, and Ill take a peek at your article.
|
|
|
|
|
TMattC wrote: didnt think of the implications of it.
You never do until it bites you!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
after looking at this MSDN: Struct[^]
is shows that struct is a value type hence how it behaves different to a class in this situation.
way around your issue I am not sure at the moment.
Every day, thousands of innocent plants are killed by vegetarians.
Help end the violence EAT BACON
|
|
|
|
|
Hi!
I have made a c# program that writes a binary file of approximately 16 MB, then proceeds to process the file by reading and writing individual bytes after specific rules.
Generating the inital file runs without any issues, but when the actual processing starts, so do my problems:
Test application:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
FileStream Stream = new FileStream("test.file", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
int i;
int NumReads, NumWrites;
NumReads = 0;
NumWrites = 0;
for (i = 0; i < 1024 * 1024; i++)
{
Stream.WriteByte(0);
NumWrites++;
}
while (true)
{
for (i = 0; i < Stream.Length; i++)
{
Stream.Position = i;
int x=Stream.ReadByte();
NumReads++;
if (i % 16 == 0)
{
Stream.Position = i + 8;
int y = Stream.ReadByte();
NumReads++;
Stream.Position = i + 10;
Stream.WriteByte(1);
NumWrites++;
}
}
Console.WriteLine("Loop done. Reads="+NumReads.ToString()+", Writes="+NumWrites.ToString());
ConsoleKeyInfo result = Console.ReadKey();
if (result.Key==ConsoleKey.Escape) break;
}
Stream.Close();
}
}
} The process is painfully slow, and the program appears to be reading huge amounts of data during the process, according to Task Manager, during program execution, it looks like the program is reading 300 MB/second, or more, which is about what my HDD can do. The number of writes performed are looking normal.
I have tried implementing counters for read and write operations, and these seem to match what I am trying to do.
I have tried lots of different buffer sizes when initializing the FileStream, but the results are the same.
I dont know whether it is Task Manager being off, or c# actually messing up I/O so badly.
Does anybody have any idea what is going on ?
Thanks in advance,
Dan
modified 2-Apr-15 1:15am.
|
|
|
|
|
Most of your code seems to be missing from that post. Use the "Edit" link to update the post with the missing code.
Also, you should wrap your code in <pre lang="cs"> ... </pre> tags, or use a fenced code block:
<pre lang="cs">
Your code goes here...
</pre>
-or-
```cs
Your code goes here...
```
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Sorry about that, and thanks for showing me how to do it properly, my post has been updated.
|
|
|
|
|
I think you forgot some code there. You may also want to use a code block for the code.
What do you get when you cross a joke with a rhetorical question?
The metaphorical solid rear-end expulsions have impacted the metaphorical motorized bladed rotating air movement mechanism.
Do questions with multiple question marks annoy you???
|
|
|
|
|
Sorry about the mess in the first post. I am new to the forum, and didnt know how to do it properly.
|
|
|
|
|
Reading and writing single bytes is hugely inefficient, especially when doing it randomly. Disk files are processed in fixed block sizes determined by the underlying filesystem. When you wish to write a random byte to a file the system must first read the block that contains that byte, replace the byte, write the block back to disk. So replacing a few bytes in a single disk block would incur quite a large overhead in the background.
|
|
|
|
|
Hi, Richard,
I agree, and since yesterday I have worked on implementing buffering, which is now operational.
But it seems that something far stranger is going on, as I tried a buffer that can hold the entire file in memory, and only write it at the very end. Still my number of reads explode when the program is running, and I have found out that the major part of the reads that Task manager is counting are done where my program does what calculations, and other stuff, none of which involve I/O at all....
Some of my method calls seem to generate I/O just by performing simple calculations, or filling an array with numbers, and such.
Still investigating what is going on.
|
|
|
|
|
Use a virtual disk drive! (Just kidding).
The file you are reading and writing is actually 1MB; not 16MB.
"Reads" and "writes" are usually buffered; in your case however, due to "positioning", you seem to be losing the benefits of buffering in your reads.
While "logically", you are only reading about 1MB, in actuality, you are reading about 4GB with each iteration.
Sector sizes / allocation units are running around 4KB these days; this is what you are transferring between disk and memory for each one of your reads; and why you are seeing those high transfer rates (300MB/sec).
Unless this is some specific "disk exercise", I suggest you do all your "reading and writing" to a byte array and then just write the whole thing out when you're done.
(Depending on the speed and memory of your computer, this may also be a factor in this case; others may not notice the degradation).
|
|
|
|
|
Hi Gerry,
I know about the file size, the program was to demonstrate the behaviour, not the actual program I am developing. When the program is done, some of the files that need processing will far exceed available RAM of any windows computer I know (TB size files).
Also, see my reply to Richard above.
|
|
|
|
|
dear Sir,
I saw a open source developer for C# name is sharpdevelop.
http://www.icsharpcode.net/OpenSource/SD/
I want crate a developer with simple functionality. for example the user can create a form and insert only some buttons and text box only. then can create a exe file from it.
so I want can any body can help me on this issue and guide me some help document on this issue?
Best Regards
|
|
|
|
|
First, it's not a "developer". It's an IDE, or Integrated Development Environment.
Second, what you ask you're not going to get in a couple of forum posts. Creating a designer for a form is a monumental task.
You can start by reading this[^] and this[^] and this[^].
All of these articles are pretty old. I can't find any new ones and there is no "one place" to find all the information you're going to need to do this.
|
|
|
|
|
Thanks for your answer. your links is useful and I try to learning its.
|
|
|
|
|
Creating such an IDE is a very advanced topic and neither you nor I is qualified to do it.
|
|
|
|
|
I am developing a web application which has to make asynchronous calls because I have to make sure UI thread is not hanged.
In my application I have around 15 projects like SampleProject1, SP.BLSP, SP.Web, .. Also for every service call there is two minutes timeout.
I am trying to implement signalR in my code for waiting until each function is executed completely. Please see the following sample code.
After the first service call completed, it calls the second. The second call will surely takes more than two minutes. It might take more than 10 mins.
And I need to use results from first service call in second.
When implementing signalR, I tried to install Microsoft.Owin It asked for which project to add. I am trying to add SignalR Startup class in my SampleProject1.
I am not sure if:
1. SignalR is right way for doing this approach or not.
2. If I can use SignalR, in which project should I add this Microsoft.Owin
I tried google but most of them showed how to implement in new project and with out web service calls.
For example:
namespace SampleProject1
{
public partial class lengthProcess : UserControl
{
public lengthProcess()
{
FirstWebServiceCaller1 FWbSvcCallr1 = new FirstWebServiceCaller1();
FWbSvcCallr1.Process1Completed += new EventHandler<request1completedeventargs>(FirstWebServiceCaller1_Process1Completed);
FWbSvcCallr1.Process1();
}
private void FirstWebServiceCaller1_Process1Completed(Object sender, Request1CompletedEventArgs e)
{
FirstWebServiceCaller1 FWbSvcCallr1 = sender as FirstWebServiceCaller1;
if (FWbSvcCallr1 != null)
FWbSvcCallr1.Process1Completed -= WebServiceCaller1_Process1Completed;
if(e != null)
{
SecondWebServiceCaller2 SWbSvcCallr2 = new SecondWebServiceCaller2();
SWbSvcCallr2.Process2Completed += new EventHandler<Request2CompletedEventArgs>(SecondWebServiceCaller2_Process1Completed);
SWbSvcCallr2.Process2(e.Results);
}
}
private void SecondWebServiceCaller1_Process2Completed(Object sender, Request2CompletedEventArgs e)
{
DoSomething(e.Results);
}
private void DoSomething()
{
}
}
}
Thanks in advance.
Valli.
|
|
|
|
|
I'm not sure exactly what you were asking there, but it appears as though you want to know how to increase the timeout. Is this correct? If it is, you should look to configure the ConnectionTimeout as described here[^].
|
|
|
|
|
Hi
I have a fingerprint reader on my laptop. It is used for the windows authentification.... I'm searching any information and samples of source code in C# to access to this device.... Thanks
Jerome
www.jfortias.net
Jerome
www.onplonge.com
www.sap-integration.net
|
|
|
|
|
The reader must have an API of some description. Your best bet is to start off with the manufacturer site and see what documentation/API details are available there.
|
|
|
|
|
I tried to find it but that's a dell laptop
Jerome
www.onplonge.com
www.sap-integration.net
|
|
|
|
|
Your best bet is to collect some information:
1. The computer are you using (Make, Model, etc.)
2. On your computer investigate all of the installed devices using the device manager (found under Start/Settings)
3. Once you've found the device in question use the context menu and open the property dialog.
4. Go through all the tabs and see what drivers and dlls are installed for the device.
5. Use all of the above information to make intelligent queries on the internet using your favorite search engine.
6. Also contact the maker of your computer if the device came preinstalled and ask them about information of said device.
Cheers!
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|