|
luckykhalid wrote: Another solution to this problem is that I make a separate .dll for all my custom objects that need to be communicated between server/client and place the same copy of that dll at both the sides.
This is exactly the "typical" solution. BTW, take a look at what the BinaryFormatter is producing. It's slow, and it's a hog. As someone else posted to a question I was asking, a "bool" (one byte) takes 256 bytes when BinaryFormat'ted.
If you can at all avoid the BinaryFormatter, do so. It's intended for reflection deserialization, thus it retains type and version information, which is why you are getting your problem.
If you are simply serializing native types, like ints, strings, etc., I would suggest writing your own serialization. I have RawSerializer class that I've written, that will eventually become an article. If you're interested, send me an email and I'll send you the code. It also handles structs like Guid, DateTime, and your own structs, as long as the contents are native types.
Marc
VS2005 Tips & Tricks -- contributions welcome!
|
|
|
|
|
i everyone,
I have a need where I have to get a reference to a control running in another application (in a different process) through its handle.
.NET has this nice method where you can get a control from its handle:
Example:
Control con = Control.FromHandle(controlHandle);
It's nice but it only works on the controls that are within your own process space. Now, I am wondering if there is a way that I can run my application in the other application's process or there is a way that I can inject my code into that process.
I would really grateful for any help that you can give me!
Cheers,
Keith
|
|
|
|
|
Hi:
I have an application with a GUI that drives a math simulation. The simulation would run in about 10 min during which the GUI would go white and be unresponsive.
To fix that unresponsive behavior, I put the math simulation call in a separate thread. Now the GUI is responsive, but the simulation takes 1 hour to run. I have tried fiddling with the threadpriority of both the simulation thread and the GUI thread, but have seen little change. I am about to give up on the threading since I cant afford the 1 hr sim time to get the responsive GUI.
Have any of you seen this problem, and could you suggest any way to make threads work without costing so much execution time?
Thanks, Sam
|
|
|
|
|
Are you continously acessing the user interface from your worker thread? If you are reading values or writing to controls in the UI from a worker thread, those calls will take longer when properly marshaled. Make sure your worker thread has a local copy of data to work with and only synchronizes with the UI thread every once in a while.
I'm just guessing here. You can get a profiler or write some logging statements to see what operations are now taking longer.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
The worker thread has its local copy of the GUI fields - these are set at the initiation of the simulation. Thanks for the suggestion however.
|
|
|
|
|
That's a tough one. There has to be some sort of hidden synchronization cost that you are missing. As long as you are only transfering simple datatypes there shouldn't be any. One way to see if there is a lot of syncronization is to open performance monitor and see if the number of context switches goes way up when you start your thread.
Also, just to make sure, we are only talking about 1 worker thread. Running more then a few active threads at once is a really good way to slow a system down to a crawl.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
This is what you do
Create a button on your form that when clicked starts a thread that runs the simulation.
And WOLA!!!!!
Please understand the pseudo code below
Button1_ClickEvent()
{
Thread t = new Thread(new ThreadStart(StartSimulation));
t.IsBackground = "true";
t.Start;
}
The thread will start and return back to your form waiting for another event
In the meantime your thread is running in the background.
Be sure to put a Thread.Sleep(1000) some where in your simulation method if your running a
continous loop. That will free up some of the hogging of the cpu processor.
Allowing other threads time to do something... this may be causing your laggggg....
This is a simple work around approach...
Ya get my drift???
Kourvoisier
-- modified at 16:37 Tuesday 15th November, 2005
|
|
|
|
|
Have you even tried to understand what he meant?
He said that is simulation thread is taking too long and you really suggest putting some Sleep statements into it?
Besides that you have four errors in your few lines of sample code.
|
|
|
|
|
Yes you are right, i did not understand what he meant now i do....
please disregard my post. As i thought your form was not loading at all when you started your thread.
But my code on the other hand was really meant to be pseudo code not to be followed
by the syntax...
you get the point i was making in the code...
Smart guy!!!
Kourvoisier
|
|
|
|
|
I prefer using Delegate.BeginInvoke myself, since the syntax is more natural and it returns a syncronization object so you don't have to manage it yourself.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
I do not seem to understand how events work in C#. I'm trying to write a sockets class that will fire off and event when the connection is made and or dropped. So I have a class call CMySocket.
In the namespace MySocket (outside of the class) I have my delegates
<br />
public delegate void OnConnectHandler(CMySocket sender, EventArgs e);<br />
public delegate void OnDisconnectHandler(CMySocket sender,EventArgs e);<br />
In the class I have the event handlers
<br />
public event OnConnectHandler OnConnected;<br />
public event OnDisconnectHandler OnDisconnected;<br />
I have a method called Connect()
<br />
public void Connect()<br />
{<br />
m_socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);<br />
IPEndPoint ipend = new IPEndPoint(Dns.Resolve(sIPaddress).AddressList[0],nPort);<br />
m_socketClient.Connect((EndPoint)ipend);<br />
if (OnConnected != null) OnConnected(this, new EventArgs());<br />
}<br />
In my form class I have a method
<br />
public void OnConnected(CMySocket mySocket, EventArgs e)<br />
{<br />
MessageBox.Show("Connected");<br />
}<br />
But this method is never called from the event. What am I doing wrong. I thought I was following the tutorials correctly can some one please help
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
hoping i've understood you right.
just after the point where you create a new socket, you need to add some code like mySocket.OnConnected+= new OnConnectHandler(mySocket_OnConnected)
then replace the OnConnected function with:
public void mySocket_OnConnected(object sender, EventArgs e)
{
//some stuff
}
i've been doing something similar recently and had problems with events being raised on the wrong threads, if you get threading messages you'll need to look up BeginInvoke()
hth
Russ
|
|
|
|
|
I have two classes one for the form called form1 and one for the socket called CMySocket
Are you saying that I need to add this to the form1 class or the CMYsocket class?
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Never mind I figured it out. So how did you raise your event for the disconnect? Did you do it when you tried to recieve data and got back a socket error?
I have to admit that events on sockets in MFC are a lot easier.
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Hi im jus wondering if anyone knows anyway to change the layout of a datagrid. at the moment im returning rows from the database and displaying the column names across the top like normal but im just wondering if anyone knows how to display the columns down the side of the datagrid. Thanks in advance
|
|
|
|
|
I don't know how you'd do it with a standard grid, but Developer Express[^] have a Vertical Grid component, if that's any help.
|
|
|
|
|
Hi buddies,
Suppose we have created an AppDomain with FriendlyName "NewDomain" in the current AppDomain named "CurrentDomain" and have created an instance of class A in that, now we call some method of that instance, Here is the code:
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = @"c:\myApp";
domainSetup.ShadowCopyDirectories = @"c:\myApp";
domainSetup.LoaderOptimization = LoaderOptimization.SingleDomain;
AppDomain appDomain = AppDomain.CreateDomain("NewDomain", null, domainSetup);
// Here the constructor is called in the 'NewDomain' domain
A obj = (A)appDomain.CreateInstanceAndUnwrap(assemblyName, "A");
// Here the 'MyMethod' is called in the current application domain
obj.MyMethod();
While tracing "AppDomain.CurrentDomain.FriendlyName" in class A, I see:
1. In its constructor scope, it is "NewDomain", that is ok
2. In the called method scope, it is "CurrentDomain".
It means that the method is called in the 'CurrentDomain', while I wana the method be called in the "NewDomain" application domain.
How can I perform it ?
Thanks
---
"Art happens when you least expect it."
|
|
|
|
|
Make sure that A derives from MarshalByRefObject and isn't just serializable.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
Yes, that solved it,
Thank you Andy very much
---
"Art happens when you least expect it."
|
|
|
|
|
Hi,
After filling a dataset I would like to further filter the results without repopulating the dataset. Any help would be appreciated.
"She folds her legs...in doing so I glimpse Xanadu."--Gilby
|
|
|
|
|
Hello All,
I developed a Com+ Application it will work in the clients machin and do some work in the SQL Server. this SQL server inside a DMZ.
the problem is the component in the clients can reach the SQL Server to do the work. how can i solve this problem
Please help
Hoho
|
|
|
|
|
you need to get the appropriate ports opened up through your firewall etc
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312960 has some info on the issue, specifically how to keep it down to 2 ports.
hth
Russ
|
|
|
|
|
There is a need for custom data types to be passed and returned in Web Services methods. As far as i know WS type marshaling is been handled by XmlSerializer which has some certain limitations.
According to some of these limitations only the public fields properties and fields are serialized and any private and protected members will be ignored.This fact leeds to a certain problem because either infriges data encapsulation or break business objects' logic and rules (e.g. some properties of the business objects returned by the WS-method should have a "getter" only in order to serve the logic and i can make any compromise in this issue.)
So...
The questions are :
1.) Can i bypass this fact of ignoring private or protected members ? (Reflection does so...)
2.) If WS were not marshaling via a XmlSerializer whould the problem still existed due to some technical specs of WSs ?
3.) Let's suppose this is a limitation of XmlSerializer can i substitute it with another formatter to achieve my goal ?
Thanx in advance, i would appreciate very much some help.
|
|
|
|
|
Keep in mind that the client doesn't get the full type information of your object. It only gets an object containing your public fields. The web service is really just a collection of methods which pass simple data objects back and forth. Think C-structs rather then C++ objects.
If you are returning the data from an existing object, you can markup your object with various XmlSerialization attributes to determine which properties and fields are serialized.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
You are right...A WS doesnt actually returns the object but a simple representation of it.I achieved to bypass the XmlSerialization in a way (not completely) by returning from my methods a byte array which actually is a memory stream of the object after being serialized via a binary formatter.This helped me achieve the consistency of my business objects and saved me from marking every single property from the XmlSerialition attribute.
Thanx.
|
|
|
|