VS 2010 Modifying A Collection Currently In Use On A Different Thread?
May 17, 2011
So one of my programs logged an error the other day that I am trying to fix. The error was Collection was modified; enumeration operation may not execute.To overly simplify my code, users can add or delete objects from the collection at runtime. In the background, on a separate thread, a process runs every so many seconds that syncs the data in the collection with the data in a flat file.
To avoid my problem, it seems the most logical to create a COPY of the collection at the start of my second thread's procedure, and run off of that.How do I do that?If I try to say something like.
Private Sub DBReadAccountInfo(ByVal strAccountID As String) Dim tmpaccountInfo As New PublicFunctions.clsAccountInfo tmpAccountInfo.strAccountID = strAccountID Dim ReadAccountInfo_Thread As New Thread(AddressOf tmpAccountInfo.DBLookupAccount) ReadAccountInfo_Thread.IsBackground = True
[code]....
In "sub UpdateAccount", frmMain.InvokeRequired is always false. There's a MenuStrip control I'd like to update the .Text on.
In one application, I need use 4 simultaneous threads.When the threads finished, I need to update the text of a TextBox.So, I create 4 Textbox, and I wanna the threads change the text to FINISHED.Each thread change one distinct TB.I use this "example"
Dim Terminados As Integer = 0 Private Sub frmEnviarMensagem_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = True Timer1.Start()
[code]....
The problem is, I have an error in the red lines.The error is: INVALIDOPERATIONEXCEPTION "Cross-Thread operation not valid: Control tbPlaca1 Accessed from a thread other than the thread it was created on."I don't use cross threading. Each TB only was accessed for the correspondent thread, and for the "main program".
I'm building a money management type application for just overall practice with Visual Basic, and I'm having issues modifying a number.It's a checkbook ledger, which stores the information in the text boxes into an access database. When you first load the screen, it asks you for your account balance (still a work in progress) which puts that data into a label on the form. When you add a record to the database, that new amount will get added/subtracted to what you typed in for your account balance.The problem I'm running into is the save function will first check if a radio button is clicked or not and negate the amount depending if you click Credit or Debit. Then after that's done, it performs the Sum aggregate function on the Amount Column in my database which puts the number into a variable. That variable is then added to the account balance that you typed in.I'll supply two of the functions that this is regarding. The Balance() function runs when you first start the form, and the Save() function is where the math happens.The accountAmount variable is declared under Public Class so that way the save function can use the variable to do the math required.
How would I go about modifying the following console application? It calculates resistor color codes and I need it to be able to launch or work directly from a HTML web page. (I'm well aware my calculator can be simplified with case statements and loops, only bother with that if you want to.)
:Module Module1 Sub Main() Dim tens As Integer Dim ones As Integer
Does VB 2010 offer native support for reading and modifying ID3 metadata in MP3 files? A brief search through MSDN shows me nothing, and I see someone says he had to write his own library of code for it. But that was some years ago, when you had to write code to access JPEG Exif metadata, and I know that's changed with the Image class and the GetPropertyItem method; so I'm hoping MP3 files have their own methods and properties now for this.
"Cross-thread operation not valid: Control 'Panel1' accessed from a thread other than the thread it was created on." The reason I am getting this error is because I am opening up a new form and then calling these three things:
Panel1.Show() Label1.Show() Label2.Show()
why I get this error message because it doesn't occur normally if I open Form2 after closing Form1, it only occurs when I open Form2 after closing Form4.
When my client try to connect to server I'm getting this error : Cross-thread operation not valid: Control 'l_users' accessed from a thread other than the thread it was created on.
Private Sub _socketManager_onConnectionAccept(ByVal SocketID As String) Handles _socketManager.onConnectionAccept l_Users.Items.Add(SocketID) End Sub
Would anyone be able to help me here please. I'm fairly new to VB.net and threading so im just trying to figure out what is happening.When I debug this I am getting the error thread operation not valid: Control 'ProgressBar1' accessed from a thread other than the thread it was created on.
I'm a little lost as to why the error is occuring or how to fix it. I've had to put the progress bar in a separate thread otherwise the GUI crashes
My 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).
I have written an application that loads a form - frmCad as well as AutoCad. It does this via a class which detects when AutoCad quits.
Friend Class CadApp Private WithEvents AppObject As AcadApplication... Private Sub AppObject_BeginQuit(ByRef Cancel As Boolean) Handles AppObject.BeginQuit RaiseEvent Quit() End SubEnd Class
My main class loads frmCad as well as CadApp.
Public Class Cad Private WithEvents frmCad As CadForm Private WithEvents app As CadApp... Public Sub ShowForm() If frmCad Is Nothing Then frmCad = New CadForm frmCad.Visible = True End Sub... Private Sub app_Quit() Handles app.Quit frmCad.Dispose() frmCad = Nothing .... End Sub
When I debug the program, it stops at frmCad.Dispose()The program continues to execute, but all the code after it fails to work.Looking more carefully I get an error message which contains:-Cross-thread operation not valid: Control 'Autocad' accessed from a thread other than the thread it was created on.
My error:Cross-thread operation not valid: Control 'label2' accessed from a thread other than the thread it was created on. I want to be able to give my Public RunBot() sub access to edit Labels, buttons, etc without an error.
My problem is Cross-thread operation not valid: Control 'statusHO' accessed from a thread other than the thread it was created on.
System.InvalidOperationException was unhandled Message="Cross-thread operation not valid: Control 'statusHO' accessed from a thread other than the thread it was created on." Source="System.Windows.Forms" StackTrace:
[Code]...
i used it and it works fine then. but as it is mentioned its not a good practice to use it. So what should i do? is it ok if i use this as i am not able to use correct practice. Mine application is not for enterprise purpose. its just my class project, and it works fine even if i put application working in background. System works ok. I dont know how to correct this error.As i dont have that much knowlege of threads.
So please guide me how to fix this in correct way otherwise i am force to go for bad programming practice Please refer to Windows Mobile Developer Center > Smart Device Development Forums > Windows Mobile Development > Appendtext not working for all my code details
I thought that when a variable went out of scope (like a variable declared within a method - when you exit that method the variable is out of scope) then it was eligible for garbage collection and when it was garage collected the Dispose method is called on it. Now I know that it does not get disposed immediately but I assumed it would be basically as soon as the process starts to take up quite a bit of memory.However, I found that my app's memory usage seems to constantly increase when I dont manually Dispose of a specific method local variable. Of course its good practice to call Dispose and ordinarily I would but I just didn't realise that this particular class actually implemented IDisposable. The class in question was the System.DirectoryServices.SearchResultCollection class, and I was looping through the items in it like so:
I converted a project from 2008 to 2010 to be able to use the TPL.I've updated the compile target to .NET 4. Everything seems good, including the .NET 4 specific TPL stuff...except that:[code]
I'm trying to loop through a collection object in vb2010.The code was originally used in Vb6 The book said that I needed to code a NewEnumerator method first in order to be able to loop through my collection. I coded the following:
[code]...
It gives an error for IUnknown, staging that IUnknown is not accessible in this context because it is a 'Friend'.In the line in the function I removed the Set since it's no longer needed.The error message for this line is '_NewEnum' is not a member of 'Microsoft.VisualBasic.Collection'What are these messages and how do I fix this in VB 2010?m_colCourse is not a system collection.
Ok say I have this Dim MyQueueOfClients as new Queue (Of TcpClient) I also have two threads.
In thread one a TcpListener waits for connections then adds a connected TcpClient to MyQueueOfClients.
MyQueueOfClients.Enqueue (TcpClient)In thread two I then check to see if there are any Clients in MyQueueOfClients. If so I then remove them from the MyQueueOfClients.
MyTcpClient = MyQueueOfClients.Dequeue I think the question Im asking is this thread safe?
Can I Enqueue and Dequeue at the same time from different threads?
Well it helps if you read everything. I have just read this as well
A Queue(Of T) can support multiple readers concurrently, as long as the collection is not modified. Even so, enumerating through a collection is intrinsically not a thread-safe procedure. To guarantee thread safety during enumeration, you can lock the collection during the entire enumeration. To allow the collection to be accessed by multiple threads for reading and writing, you must implement your own synchronization.
I am trying to work out a way to group a collection of items like an enum so that I can access them through code else where in my program. i.e I have list of items and sub items
As the title says can I create a memorystream then use it in a FIFO manner like a Queue.When you use memorystream.write it writes data at the memorystream.postion.If I then want to read the beginning of the memory stream I have to set position to the beginning and do a memorystream.read.
<UnmanagedFunctionPointer(CallingConvention.Cdecl)> _ Public Delegate Sub DeviceDetectionEvent(ByVal YasdiEvent As YASDIDetectionSub, ByVal DeviceHandle As UInteger, ByVal param1 As UInteger)
i want to use thread in vb.net 2010 and have problem :( after run the project showed this message for meError > " Controls created on one thread cannot be parented to a control on a different thread."
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
I'm trying to query a DataTable to get a collection of rows but I'm finding that my search string has to be the exact length of the columns width. So, for example this won't work:
Dim rows As DataRow() = (From r In myTable.AsEnumerable() Where r.Field(Of String)("fname") = "Bob").ToArray()
...but this will:
Dim rows As DataRow() = (From r In myTable.AsEnumerable() Where r.Field(Of String)("fname") = "Bob ").ToArray()
The search term ("Bob") has to be padded with spaces to make it equal in length to the column width (10 characters). Is this how it's supposed to work or am I doing something wrong?Also, how can I do a LIKE search? So for example, I want to search for all names that start with "Bo" or whatever. ie. "Bo*".
I have a problem that can be best solved with LINQ. I have a class that has 2 properties of which 1 is a single. I have a collection of that class and I need to select the instance with the highest single value.[code]I'm having a hard time explaining this even this is a simple task. Please ask if you don't understand.In addition to my original question, How would I create a collection containing the 5 highest Instances.