C# - Does Queuing Threads Impact Non-thread Safe Objects In The Same Class
May 23, 2011c# - Does queuing threads impact non-thread safe objects in the same class?
View 1 Repliesc# - Does queuing threads impact non-thread safe objects in the same class?
View 1 RepliesIf I spawn a thread with ThreadPool.QueueUserWorkItem and that thread does not reference the object that is not thread safe, would it compromise that non-thread safe object? By not thread safe object, I mean a third party interface to a programmable logic controller that has no ability to open simultaneous connections or concurrency support.I suppose I just wanted to be sure that by queuing threads in the same class as my reference to that object, I wouldn't somehow be compromising its thread safeness in a way I didn't realize.
View 2 RepliesWhat is the best way to pass objects between threads? I would like to create a new thread that creates a new object : Dim myobject as newobject = new newoject Then in my main thread, I would like to use myobject. Ideally I would like to just assign to a global variable but I don't think that is possible. I think I may have to use some form of delegate function (but I think the child thread would need to complete to use a callback). The new thread will not actually end before I need the object reference in the main thread. How should I go about this?
View 2 RepliesMy understanding is that thread.join will suspend the execution of code on the calling thread until the spawned thread finishes or is aborted...
With that in mind, I tried this:
For i = 1 to 50
threads = New Thread(AddressOf test)
threads.IsBackground = True
threads.SetApartmentState(ApartmentState.STA)
[CODE]...
However, the rest of the code runs when the loop finishes, not waiting for all the spawned threads to finish. Since the rest of the code needs the threads to finish (otherwise the rest will error).
There is a problem with standard System.Timers.Timer behaviour. The timer raise Elapsed event with some interval. But when time of execution inside Elapsed event handler exceed timer interval then thread pool begin queuing event handling. This is a problem in my case. This is because with my Elapsed event handler I fetch some data from database and doing something with it and finally save results back to database. But data handling should be provided only once. So, is there a way to prevent from queuing elapse events for System.Timers.Timer.
As illustration for this issue you can consider next test program:
[code]...
2) Second way is about SynchronizingObject, but it is a valuable only for Windows form application or required additional development of code for implementing object that would be implements ISynchronizeInvoke interface. More about this way you can find here
I have got my multi threaded application running which is a Windows Service Project.
Basically when the service starts it starts a thread listening on a port for connections. The reason I started this on a new thread was so I could easily control it and not lock up that main worked thread.
Now on that thread when a client connects it dynamically assigns them another port number that is not currently in use and starts a new thread listening on that port and waits for the client to connect to do the actual data crunching.
So basically I have my main project thread, a Main listening thread then the possiblity of 0 to 100 more threads for each connected client.
Now this project should always be running but in the event it needs to be shut down (or server rebooted etc) I want to be able to shutdown the threads safely.
I can down my main listening thread safely but my trouble is all those other possible threads. What I would like is if the service is called to stop I want any of those other possible running threads which would have an active connection to the client to send a simple command like 'STOP' then close the connection gracefully (MyConnection.Close) and end itself.
The only solution I can think of which I don't really want to do is have a global varible (StopThreads as Boolean) and after each command in the thread check that boolean and if its set to true jump to some code to do what I want and end the thread but there must be an easier way? Or is this the best way?
I'm calling a c++ dll I made myself - and it appears to be very VERY not thread safe!
I'm referencing it like this
<System.Runtime.InteropServices.DllImport("D:ACS DesktopdcxdcxDebugStringLibrary.dll", EntryPoint:="firstIndexOfKeyword", CallingConvention:=Runtime.InteropServices.CallingConvention.Cdecl)> _
Public Shared Function firstIndexOfKeyword(ByVal s As String, ByVal substr As String(), ByVal substrLength As Integer, ByVal markers As Integer()) As Integer End Function
Is there a way to make this IMPORT create something more threadsafe?
[Code]...
I'm dropping into this function - from several threads - to add an OBJECT to a dictionary collection
Private Delegate Function ReaderRegisterDelegate(ByRef rrFSOb As FSObject) As FSObject
Private Function ReaderRegister(ByRef rrFSOb As FSObject) As FSObject
Try[code].....
It's getting Object reference not set to an instance of an object.The FILEID key being added is F1. F2, F3 and F4 are in the dictionary. Seems like F1 arrived and the object wasn't properly setup. Or thread-slice caused me to see a partially messed with dictionary list?How can I make that a thread safe operation? I thought dropping out to the UI thread was a safe place to mess with code like this? Oddly enough I can go to the immediate window and do this
m_FSObCollection.Add("F" + rrFSOb.FileId.ToString, rrFSOb)
?m_FSObCollection.Count 4
ex.data is a dictionary list that looks like this
directcast(ex.Data , System.Collections.IDictionary).Count 0
Let's say that I have a module that has a Queue in it. For other entities to Enqueue, they must go through a function:
[Code]....
If I have multiple threads running and they want to call InsertIntoQueue(), is this considered thread safe? I am under the impression that there is only one copy of the instructions in memory necessary to perform the InsertIntoQueue() function... which would lead me to think that this is thread safe. However, I wonder what happens when two threads attempt to run the function at the same time? Is this thread safe, and if not, how can I make it thread safe? (and What would be the performance implications regarding speed and memory usage)
I have a TCP server app that starts 2 threads when the server is activated, I want the threads to add text to the textbox on the main form. Here's is what I have tried [code]I have added MsgBoxes at points so I know the Sub updatetext_ is being called, and the text is being passed, they are also showing that InvokeRequired is always FALSE. In any case the textbox txtMessages is not being updated.
View 11 RepliesOn the MSDN docs for the generic List(Of T) class, it says this:
Quote:
Public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.but I'm trying to work out what exactly that means or why it matters. Does that mean that if I had this:
vb.net
Public Shared MyList As New List(Of MyClass)
then I could enumerate through that list from several threads at once without there being a problem? I thought you could read from any object from multiple threads without a problem anyway... I thought it was only if there were potentially other threads modifying that object at the same time that there were problems. Particularly with a collection like a List because you cant modify a list while another thread is enumerating the items in the list as you get an exception thrown stating that the collection has changed. I think basically what I am asking is if the MSDN doc said that a public shared list wasnt thread safe then what difference would it make?
I am trying to add a subitem to a listview in a threadsafe manner.In a single threaded application it works like so:
[Code]...
However if run in another thread it causes a cross threading error.I have looked at examples of delegate subs that use Invoke, but all examples i have seen involve updating the text property of an object, and i cant get my head round how to apply the concept to actually add a subitem to a listview.
I'm receiving tons of statistics data that I need to insert into the db.I would like to implement some kind of Queue or FIFO class that keeps all the dataand when it reaches to a specific count (buffer), it will send that data to the SQL through bulk insert. This should be thread-safe.
View 3 Repliesi got a background worker that has the following code in the do work.... one of the things i want to do is to add rows if theres none available ...but i got an error saying i need to do a safe call thread...i already read about it but im stuck i put control.invoke, but that gives me an error too saying Error 1 Reference to a non-shared member requires an object reference.
[Code]...
Im creating a service for a mobile platform and I need to process user messages on a different thread than they were created on to leave the threadpool open.Anyway my App will be using a MySQL database and when it gets a message it will add the message to Another thread pool. But in the sub that procceses the messages I will need to perform query's on the database. So i know i can use a global variable and it will be visible to all threads but is making database operations safe while using a thread pool with a global mysqlconnection?
View 2 RepliesI currently have a form with a listview. On another form, I would like get all the items from that listview. This I can achieve but I always get the "Cross-Thread operation not allowed exception" message. I've tried the following code to avail.
[Code]...
I am using WCF to make a chat application - I dont think the fact I'm using WCF is relevant for this particular question but just thought I would mention it in case there is something special about the way WCF does threading that I dont know about.So I have my WCF service that runs on a server and a WPF app that acts as the WCF client - each time a new client signs in or out it updates the server WCF service to let it know that it has changed status. The server then updates a list to either add or remove the user, so this list basically represents who is online at any one time. The list is declared in the core server class like so:
vb.net
Private Shared List(Of ChatUser)
So, I have a method in my server side that is called whenever a user needs to be added to this list and originally I thought I could have some issues because while the server might be looping through this list to find out who is online, another user might have signed out and the list would therefore be modified while the server was looping through it which would cause an exception. So I added the following to the start of the method that removes a user from the list:
vb.net
SyncLock New Object
and I havent had any problems... but I'm still not totally convinced that this will completely solve the issue. So would creating a Property give me a bit of extra safety? Assuming I always used the property to access the list in my code.
Like this:
vb.net
Private Shared Property CurrentClientList() As List(Of ChatUser)
Get
SyncLock New Object
[code].....
Also, am I actually using SyncLock correctly? I mean should I be referring to a shared object that all of the threads can access rather than just doing New Object each time or does it not make a difference?
I am trying to make a thread-safe call to a button on another form and I cannot figure out how to do it.I have read all of the MSDN documentation on thread-safe calls .
View 10 RepliesIm having a problem understanding if accessing httpcontext inside a shared function, without passing in the httpcontext as a parameter is thread safe?
Are the 2 functions in the util class equally thread safe?
Class foo
Sub main()
Dim qs1 = util.getQS(HttpContext.Current)
[Code]....
''//begin cross threaded component
Private Sub dBgRIDvIEWNotInvokeRequired(ByVal dBGridViewcomponentname As DataGridView, ByVal dvalue As String)
dBGridViewcomponentname.Text = dvalue
dBGridViewcomponentname.Update()
[code]....
when used is like this CrossThreadedDbGridView(DataGridView1, "TheText") But what if I have lots of member or property to used like this code:
DbGridPapers.ColumnCount = 5
DbGridPapers.RowCount = rc
DbGridPapers.Update()
[code]....
I have a small program that checks webpages for certain strings. I am using VB express 2010 .net version 4.I have the list of URLs in a listview, and loop through all the urls, perform a webrequest, check if the source contains certain strings and then add a subitem to the current listview with text to indicate the result I am attempting to speed the application up using a parallel.for loop, but this causes a cross threading exception.This is the code for single threaded:
For i As Integer = 0 to lvUrls.Items.Count - 1
Dim lv As ListViewItem = lvUrls.Items(i)
lv.UseItemStyleForSubItems = False
[code]....
I am trying to access a dynamically generated Control from a separate thread. But I am always getting a "Stack Overflow Exception" with my code. I am using following code:
[Code]...
I Have a Function on my frmMain Class wich will update my control to something else after an invoke. When i type "?Label1.Text" on the Immediate Window, the text property IS updated, but when i go check the Form, nothing happened. The code is just like this
[Code]...
so i have a Method that is going to made Thread Safe. can i have something like this in the Method:
Public Class Q Private Shared ASD As New MyException("") Public Sub W Throw ASD if multiple threads attempt to throw the Shared exception ASD, will there be an error in the catching part? The alternative of course is to: Throw New ASD but i'm just checking to see if the first way is thread safe
i got a background worker that has the following code in the do work.... one of the things i want to do is to add rows if theres none available ...but i got an error saying i need to do a safe call thread...i already read about it but im stuck i put control.invoke, but that gives me an error too saying Error1Reference to a non-shared member requires an object reference.what can i do to add rows safely?
vb.net
Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
If DataGridView2.Rows.Item(num).Cells.Item(0).Value = "" Then
Control.Invoke(DataGridView2.Rows.Add(1))
I am trying to write a thread safe application that contains 3 threads : -
1 - Data acquisition and decoding
2- Data graphing
3 - FFT and filtering
Thread 1 is collecting bytes from the serial port and converting them int integers (so taking two bytes) after is has captured 64 Bytes and converted into 32 integers, it then needs to pass the array to the graphing thread.
The graphing thread then plots the data and waits for more data.
Thread 3 also waits until thread one has collected 2023 integers and takes these and performs some FFT calculations (which take time).
My question is how do i share the arrays between the three threads without deadlocking the program? as the serial thread will be flying around reasonable fast (1000 bytes per second) so it will synclock onto the shared buffers for most of the time.
Originally i was going to use two synchronised queues, so when thread 1 has collected 32 bytes it queues the data into the graph queue, and once it has collected 2023 it queues the data into the FFT queue.
Then thread 2 and 3 can simple dequeue the data.
However using queues has the overhead of casting the data in and out, and as i know the data type i was planning on using two arrays :-
Dim GraphArray() as ushort
Dim FFTArray() as ushort
Then Thread 1 adds data to each thread, and thread 2 and 3 simple wait until the correct amount of data is available before removing the data. my question is there an array type that allows me to remove x amount of data from an array?
Because i cannot do this easily with the ararys defined as above (GraphArray, FFTArray), as i was planning on making them 1mByte and allowing thread 1 to fill them Knowing they should never overflow and then let thread 2 and 3 remove x amout of bytes at a time unless there is a better way of doing it
[URL]
In my program, I created a list of a class that contains 5 picture boxes, a button, a label, an identifier, and some other stuff. I've got roughly 65 of these in this list. I'd be stupid to hard code all that in. The identifier is a 2nd way of identifying which specific location I'm working on.
Anways, all this is created at compile time. Works perfectly fine.
I then manually start a background worker that pings a collection of components. Based off the success of those pings, the picture boxes are enabled or disabled. Basically a proactive way to see if a collection of devices over multiple locations are actually working.
It's the background worker that fails because of thread-safe calls.
Private Sub bgwStatus_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwStatus.DoWork
Dim status As Integer
[Code].....
I'm working with BackgroundWorker, I want the BackgroundWorker do the retrieval process of data from database while the user can still do another task on the form. The problem is, after retrieving the data, I can't seem to access the ListView in my Form from the DoWork event of BackgroundWorker, I will populate that ListView using the data I've retrieved.
Consider this example, this is how I'm doing it:
Public Class Test
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
[Code].....
I have a Windows Forms app that, unfortunately, must make calls to controls from a second thread. I've been using the thread-safe pattern described on the [URL].. Which has worked great in the past.
The specific problem I am having now: I have a WebBrowser control and I'm attempting to invoke the WebBrowser.Navigate() method using this Thread-Safe pattern and as a result I am getting StackOverflow exceptions. Here is the Thread-Safe Navigate method I've written.
[Code]...
I have only managed to use an STA to run a long running excel process with a background worker and 2 delegates.
What I want to do now is have the whole application running outside of the main thread to make sure the UI is always available, I then want to create new threads from the thread I have outside of the main to run the various processes. I will need to have some form of syncronisation in there for certain things to be done once a thread is completed and also I will need to change the button states on the main form to stop certain process being called whilst other processes are running.
This is my code so far, basically this loads in a csv file to a datatable adding manager employee ID and email address, filters it and displays the resultant data in a listview. There eventually will be some filter options as well. There are then 2 options for processing the data, it will produce individual bradford factor reports and email them to each manager or will produce a summary spreadsheet that is sent to HR.
Currently because there are around 8000 lines of data, it was the summary option that required the background worker as a long running process time out error was occuring whilst in the main.
What it does is write the data from the list view to an excel sheet and colour co-ordinates the summary rows according to the absense policy. It then copied bottom to top, the summary value the next blank column against all the lines for that individual and then uses this column to decide which sheet to move the row to, copying the row to the new sheet then deleting it from the master list and shifting the cells up.
This works well, but the process of loading the data in to the list view locks up the main thread where it currently runs. I also wanted to make this slightly more complicate as far as threading is concerned, as more of a learning curve than a practical application of the function.
Here is my code so far: [URL]