c#


How to run the same background worker and stop it inside a loop in C# [duplicate]


This question already has an answer here:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on
16 answers
I wrote the following code to perform genetic algorithm that loops 10 times and each time I call the "FitnessFunction" function, I use a background worker to move an object on the topology and once it reach a specific point then I cancel that background worker and back to the "Genetic_Algorithm" function...
My Windows Form Application Main Form
Unfortunately, I got the following error when I click on "MOVE-AUV-GAAPS" button which call the "Genetic_Algorithm" method:
Cross-thread operation not valid: Control 'topology' accessed from a thread other than the thread it was created on...
and point to:
while(true)
which is in the "AUVbackGWgenetic_DoWork" function.
"Genetic_Algorithm" function :
static int geneticIteration;
 
static BackgroundWorker AUVbackGWgenetic;
 
public void Genetic_Algorithm(int[][,] population)
{
 
 
double[,] FitnessValue = new double[6, 2]; // for all five chromosome we store two Values the Fitness Value and the Fitness Ratio
 
int[] RouletteWheel = new int[6];
 
int round=0;
 
 
for (int geneticIteration = 0; geneticIteration < 10; geneticIteration++)
 
{
 
round = geneticIteration + 1;
 
writer = new StreamWriter("C:/Users/Welcome/Desktop/listOfChromosomesForAllRounds.txt", true);
 
writer.WriteLine("----------------------------------------------------------------------");
 
Chromosomes(population,round);
 
// Calculate the fitness Function and the Fitness Ratio
FitnessFunction(population); // Fitness Function
 
//RouletteWheel = RouletteWheel_Selection(population,FitnessValue); // Selection
 
//population = CrosssOver(RouletteWheel, population); //Cross Over
 
//population = Mutation(RouletteWheel, population); // Mutation
 
writer.Close();
 
 
}
 
//Store best path in the array as a group of XY coordinates
 
//for(int i=0;i<auvChromosomes.Length;i++)
 
//{
 
 
 
// }
 
//completeAUVMovement(int[,]auvPath);
 
}
"FitnessFunction" function :
public void FitnessFunction(int[][,] population)
{
 
double[,] FitnessValue = new double[6, 2]; // for all five chromosome we store two Values the Fitness Value and the Fitness Ratio
 
AUVbackGWgenetic = new BackgroundWorker();
 
AUVbackGWgenetic.DoWork += new DoWorkEventHandler (AUVbackGWgenetic_DoWork);
 
AUVbackGWgenetic.RunWorkerAsync(geneticIteration);
 
 
}
"AUVbackGWgenetic_DoWork" function :
private void AUVbackGWgenetic_DoWork(object sender, DoWorkEventArgs e)
{
 
 
Random rnd = new Random();
 
SoundPlayer player = new SoundPlayer("C:/Users/Welcome/Desktop/project/GAAPS/Sonar_pings.wav");
 
auv.auvX = rnd.Next(200, 325);
auv.auvY = rnd.Next(200, 325);
 
while (true)
{
 
Thread.Sleep(300); // assume that it represents the speed of the AUV which is in our case = 3 m/s
 
if (AUVbackGWgenetic.CancellationPending)
{
e.Cancel = true;
return;
}
 
 
if (auv.auvY == 200)
{
if (auv.queue1.Count != 0)
{
Thread.Sleep(1000);
 
foreach (Packet packet in auv.queue1)
{
auv.SendToSink(packet);
}
 
auv.queue1.Clear();
topology.CreateGraphics().DrawString("Received Aggrigated Data from AUV # " + auv.auvID, new Font("Times New Roman", 7.0f), Brushes.Red, sink.sinkX - 48, sink.sinkY - 15); // Display the sink name
topology.CreateGraphics().DrawLine(dash, auv.auvX, auv.auvY, sink.sinkX + 20, sink.sinkY + 45);
player.Play();
Thread.Sleep(3000);
player.Stop();
 
}
 
}
 
if (forward)
{
auv.auvX += 3;
 
auv.auvY += 3;
 
 
if (auv.auvY >= 326)
{
 
backward = true;
 
forward = false;
 
countNumOfPaths++;
 
}
 
}
 
if (backward)
{
 
auv.auvX -= 3;
 
auv.auvY -= 3;
 
if (auv.auvY >= 200)
{
 
backward = false;
 
forward = true;
 
countNumOfPaths++;
 
}
 
if (countNumOfPaths >= 2)
{
 
AUVbackGWgenetic.CancelAsync();
}
 
}
 
 
//////////////////////// Draw ///////////////////////////
 
iSetupDisplay = 0;
 
if (iSetupDisplay != -1)
{
iSetupDisplay += 10;
if (iSetupDisplay >= topology.Width)
iSetupDisplay = -1;
topology.Refresh();
}
 
/////////////////////////////////////////////////////////
 
}
 
 
}
What I have tried:
Run the background worker each time I call "FitnessFunction" function" which is responsible to stop it under a specific condition.
WinForms forbids to access Controls from other threads than the main UI.
Use Invoke(..) method of the form or use SynchronizationContext class.
private SynchronizationContext context;
MyForm()
{
InitializeComponents();
context = SynchronizationContext.Current;
}
///// somewhere in another thread
context.Post(myCallbackInUIThread, null) // you can use Send for synchronous call

Related Links

How do I store the currently logged in user in my table?
receiving large amount of data from serial port in c# and using progressbar [duplicate]
how to add AutoGenerateEditButton=“True” in codebehind
Update dropdownlist on a Panel
How to get selected ID and parentid from Telerik RadDropDownTree
Set Script Task code dynamically in SSIS 2012
IProcessHostPreloadClient.Preload feature with application pool in classic mode
Lync 2010 change display name of sender
Retrieve contact numbers for list of names c# wp8
detect Internet Connection/Disconnection in Console App C#
What is the best way to get Build Info in a Web application?
forwarding MailItem Outlook Addinn issue
Determining the target environment of a .NET assembly
Double assignement in object initializer
Lambda Expression without Argument
Making WCF service run over HTTP with simple user config based authentication

Categories

HOME
pact
internet-explorer
primefaces
pyspark
cors
service
fortran
window.open
android-ndk
conceptual
datetimepicker
esxi
sdk
atlassian-fisheye
scapy
wkhtmltopdf
openbsd
digital
wowza
facebook-sharer
jsfiddle
greensock
facebook-marketing-api
taxonomy
alert
project-structure
computation-theory
connection-pooling
quality-center
sha
pixels
nsopenpanel
osgi-bundle
concrete5
ibm-bpm
slim-lang
oracle-nosql
ports
aweber
ponylang
lighting
framebuffer
gem-fury
susy
jquery-ui-slider
bzip2
rexx
taiga
f#-fake
result
taleo
chrome-custom-tabs
yank
fluent-nhibernate-mapping
codesniffer
key-value-store
objectify
cexception
android-progressbar
calc
jquery-draggable
yfiles
database-project
jts
traminer
log4cxx
nmock
cakephp-2.6
vectordrawable
autopep8
backtrace
crystal-reports-7
uiblureffect
fedena
report-builder2.0
yosemite
tigase
powershell-v1.0
ios-enterprise
lettuce
sygic
nsnumber
http-compression
idoc
teamsystem
waveout
event-propagation
socketasynceventargs
advanceddatagrid
pex-and-moles
digg
file-processing
youtube.net-api
functional-specifications
moss2007-security
nyromodal
dgml
pkcs#7
calendarextender
atmega16

Resources

Encrypt Message



code
soft
python
ios
c
html
jquery
cloud
mobile