Je suis bloqué avec le problème ci-dessus. J'ai eu beaucoup de solutions mais aucune d'elles ne fonctionnait pour moi. S'il vous plaît trouver ci-joint mon codeC# - Barre de progression [Threading] Opération cross-thread non valide: Contrôle 'progressBar' accessible à partir d'un thread autre que le thread sur lequel il a été créé
private void btnRunQuery_Click(object sender, EventArgs e)
{
try
{
Thread ProcessThread = new Thread(Process);
ProcessThread.Start();
Thread.CurrentThread.Join();
}
catch
{
Debug.WriteLine("Error in model creation");
Console.WriteLine("Error in model creation");
}
finally
{
//dsModel = null;
}
}
private void Process()
{
using (var dataContext = new IControlerDataContext())
{
dataContext.EnlistTransaction();
IItemPropertyRepository itemPropertyRepository = ObjectContainer.Resolve<IItemPropertyRepository>();
IList<ItemProperty> itemPropertyCollection = itemPropertyRepository.LoadAll();
totalCount = itemPropertyCollection.Count;
currentCount = 0;
foreach (var itemProperty in itemPropertyCollection)
{
try
{
message = string.Empty;
currentCount++;
if (itemProperty.DeletedDate == null && (itemProperty.MetaItemProperty.ValueType == MetaItemPropertyValueType.MetaItemTableProperty || itemProperty.MetaItemProperty.ValueType == MetaItemPropertyValueType.MetaItemTableMultiSelectProperty))
{
//Property refresh issue in only applicable for table and multitable property.
//Need to filter the itemproperty for Table and multitable select property.
message = ProcessItemProperty(itemProperty);
//txtLogDetails.Text += message + Environment.NewLine;
//txtLogDetails.Refresh();
//txtLogDetails.ScrollToCaret();
}
//Log(message);
//progressBar.Value = (Int32)(currentCount * 100/totalCount);
//progressBar.Refresh();
Invoke(new MyDelegate(ShowProgressBar), (Int32)(currentCount * 100/totalCount));
}
catch (Exception ex)
{
txtLogDetails.Text += "EXCEPTION ERROR : " + itemProperty.Id.ToString();
dataContext.RollBackTransaction();
}
}
dataContext.CompleteTransaction();
}
}
delegate void MyDelegate(int percentage);
private void ShowProgressBar(int percentage)
{
progressBar.Value = percentage;
progressBar.Refresh();
//txtLogDetails.Text = message;
}
Quand il exécute "Invoke (nouvelle MyDelegate (ShowProgressBar), (Int32) (currentCount * 100/totalCount));" cette ligne est hors de portée. Il va à l'intérieur et n'est jamais revenu. et aussi n'a pas pris dans l'exception.
Quelqu'un peut-il m'aider s'il vous plaît?
Merci, Mahesh
Au-dessus du code pour mon contrôle, dois-je insérer dans la méthode "Process()"? Sinon, où dois-je insérer ce code? – Mahesh
J'ai mis à jour ma réponse pour correspondre à votre code –
Salut Pierre, Merci pour la réponse rapide – Mahesh