|
It should compile under .NET 2.0 syntax (where delegates can be inferred from the method passed). If you're not using a C# 2.0 compiler, you'll need to explicitly create the delegates:
ThreadStart method1 = new ThreadStart(GetData1);
AsyncCallback callback = new AsyncCallback(myCallbackFunction);
method1.BeginInvoke(callback, null);
...
void MyCallbackFunction(IAsyncResult result)
{
}
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Bought a House!
Judah Himango
-- modified at 15:40 Wednesday 14th December, 2005
|
|
|
|
|
Thanks that did the trick.
Sorry, but I am still in the stone ages using .net 1.1 and Visual Studio 2003
Thanks again
|
|
|
|
|
Well, it compiles but it doesn't ever call the callback function
Here is my callback function
void MyCallbackFunction(IAsyncResult result)
{
if( result.IsCompleted )
MessageBox.Show( "Callback triggered");
}
Here is how I am calling it
ThreadStart method1 = new ThreadStart(RequestVehicles);
AsyncCallback callback = new AsyncCallback(MyCallbackFunction);
method1.BeginInvoke(callback, null);
Thread tThread = new Thread( method1 );
tThread.IsBackground = true;
tThread.Start();
Have I done something wrong?
-- modified at 17:19 Wednesday 14th December, 2005
|
|
|
|
|
In that code snippet, you're calling RequestVehicles 2 times: once when you call method1.BeginInvoke method, and again when you explicitly create your Thread and call .Start on the thread. Just remove that explicit thread creation, it's redundant. Your code should look like:
ThreadStart method1 = new ThreadStart(RequestVehicles);
AsyncCallback callback = new AsyncCallback(MyCallbackFunction);
method1.BeginInvoke(callback, null);
void MyCallbackFunction(IAsyncResult result)
{
if( result.IsCompleted )
MessageBox.Show( "Callback triggered");
}
Note that if you used
Thread t = ...
t.Start()
it will not call any callback method. Only BeginInvoke does that.
|
|
|
|
|
Thanks I will try that directly
|
|
|
|
|
Sounds rather complex, let me think:
Every process should have some kind of semaphore. GetData2 should call wait on the semaphore of GetData1. GetData1 should call signal on the semaphore it has, so that GetData2 continues. GetData3 should call wait on the semaphore of GetData2 and GetData2 should call signal on the semaphore it has, to let GetData3 continue.
This should work just fine and you dont have to worry about a lot of the synchronisation here There are other ways to do this, but this is by far the simplest solution I can think of.
WM.
What about weapons of mass-construction?
-- modified at 15:21 Wednesday 14th December, 2005 (Fixed some minor spelling issues )
|
|
|
|
|
Although it seems you already found a solution just another question:
If those three threads get executed sequentially (one after the other) why don't you just call all three methods in a single thread?
|
|
|
|
|
|
I used a combination of both tips
ThreadStart method1 = new ThreadStart(DoRequests);
AsyncCallback callback = new AsyncCallback(MyCallbackFunction);
method1.BeginInvoke(callback, null);
void DoRequests()
{
RequestVehicles();
RequestCustomers();
RequestServiceSales();
}
void MyCallbackFunction(IAsyncResult result)
{
if( result.IsCompleted )
{
}
}
Thanks All
|
|
|
|
|
I made a windows form app that executes a query to an Oracle database. It takes about 5 seconds for the query to execute. If a user presses the button and it takes 5 seconds, they might think its not working.
I want to display a message while it executes the query. The whole query is wrapped up in a function called “ConnectToOracle()”. Obviously it is of type void. I tried to make a while loop that did this…
ConnectToOracle();<br />
<br />
While (ConnectToOracle)<br />
<br />
{<br />
<br />
Label1.visible = true; <br />
<br />
}
It gave me an error that said cannot implicitly convert type ‘void’ to ‘bool’.
Is there anyway I can do this??
Thank you!
Apoc
|
|
|
|
|
Alternately put the label display calls inside ConnectToOracle() on either side of the db operations. You should consider doing this in a seperate thread though so it doesn't lock the GUI.
<br />
void ConnectAndShowWait()<br />
{<br />
Label1.visible = true;<br />
<br />
ConnectToOracle();<br />
<br />
Label1.visible = false;<br />
}
|
|
|
|
|
A while clause expects a boolean value. while(somethingIsTrueOrFalse). Since ConnectToOracle is returning void, while won't work.
What you need is a seperate thread of execution to connect to the database, keeping your UI thread alive and functional. To do this:
using System.Threading;
ThreadStart methodToExecute = new ThreadStart(ConnectToOracle);
Thread oracleReaderThread = new Thread(methodToExecute);
oracleReaderThread.Start();
This will keep your UI thread responsive because it's not actually doing anything. The background oracleReaderThread will begin executing in the background.
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Bought a House!
Judah Himango
|
|
|
|
|
Wow! That made a huge difference! Thanks so much!
Apoc
|
|
|
|
|
Don't be fooled about speed difference. It will still take just as long (in fact, probably longer on a single-processor machine) to read the data from the database. It's just that the reading won't block your UI thread, which makes everything appear responsive & fast. Users like this. Just beware that multithreading can get very hairy; threads sharing states, threads accessing the same resource, locking & deadlocks, doing UI stuff on background threads, all are difficulties you'll run into if you use threads. I suggest you do some reading[^] on the subject.
|
|
|
|
|
You could also display a wait cursor:
try {
Cursor.Current = Cursor.Wait;
ConnectToOracle();
} finally {
Cursor.Current = Cursor.Default;
}
|
|
|
|
|
I tried that and it said it did not recognize Wait and Default. Am I using an old version of .net? Is this only for 2.0?
Apoc
|
|
|
|
|
No i was a just a bit too quick:
try {
Cursor.Current = Cursors.WaitCursor;
ConnectToOracle();
}
finally {
Cursor.Current = Cursors.Default;
}
Now it should compile
|
|
|
|
|
Ah.. that worked!
Thanks!
Apoc
|
|
|
|
|
Visual Studio's intellisense function would actually have shown you other cursor-options in a listbox. Use it!
modified 12-Sep-18 21:01pm.
|
|
|
|
|
You can show a Progress bar to the user which increments its value by 20 for every second. When 5 seconds will complete, the progress bar will reach 100 i.e. maximum. By this way the user will be assured that something is going on and he will be satisfied
Regards
Sandeep
+919891027854
A student knows little about a lot.
A professor knows a lot about little.
I know everything about nothing.
|
|
|
|
|
Hi
I am working in ASP.net and C#. I have a result.aspx page. I have to delete a file if the result.aspx page is closed or even if the user just moves from result.aspx page and goes to another page in the application. Could somebody please suggest some solution to this problem.
Any help would be appreciated.
Thanks
Chinky
|
|
|
|
|
Hi there,
In the Page_Unload event....
<< >>
|
|
|
|
|
Hi
Page_UnLoad event is not called when I close the browser. I am not able to delete file in the Page_UnLoad event.
|
|
|
|
|
You can detect when the session ends in Global.asax
But it depends on how you work with the file, is it per session or per page?
WM.
What about weapons of mass-construction?
|
|
|
|
|
In this case, you have to implement some js code in the onUnload event at client-side...
This link OnUnload event might help u...
<< >>
|
|
|
|