"System.IndexOutOfRangeException: 'Вероятное состояние гонки ввода-вывода обнаружено при копировании памяти. Пакет ввода-вывода не является потокобезопасным с помощью default. В многопоточных приложениях доступ к потоку должен осуществляться потокобезопасным способом, например, через потокобезопасную оболочку, возвращаемую методами TextReader или TextWriter Synchronized. Это также относится к таким классам, как StreamWriter и StreamReader.'"в некоторых случаях.
Я хочу, чтобы основная функция находилась в основном потоке, а индикатор выполнения обновлялся в другом потоке, и, конечно, я хочу, чтобы файлы сохранялись один за другим, а заполнение индикатора выполнения происходило. один за другим. Действительно, я хочу избежать многопоточности, поскольку вся программа написана в однопоточном режиме, просто есть еще один поток для обновления каждого значения индикатора выполнения. Ниже мой код. Я рад вашей огромной помощи.`public class SaveToMatlab
{
ProgressBar ProgressBar = new ProgressBar();
Код: Выделить всё
private void BtnSaveToMatlab_Click(object sender, EventArgs e)
{
ResetProgressBars();
if (!backgroundWorker.IsBusy)
{
backgroundWorker.RunWorkerAsync();
}
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < tableLayoutPanel.Controls.Count; i++)
{
var flp = tableLayoutPanel.Controls[i] as FlowLayoutPanel;
if (flp != null && flp.Controls.OfType().Any(x => x.Checked))
{
progressBar = flp.Controls.OfType
().FirstOrDefault();
if (progressBar != null)
{
var directory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MatlabOutput");
fileList[i].SaveLogToMatWorkSpace(Path.Combine(directory, $"matlab_{fileList[i].GetIdentifier()}.mat"), backgroundWorker);
}
}
}
}
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = progressBar.Value + e.ProgressPercentage > 100 ? 100 : progressBar.Value + e.ProgressPercentage;
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Operation was canceled.");
}
else if (e.Error != null)
{
MessageBox.Show("An error occurred: " + e.Error.Message);
}
else
{
MessageBox.Show("Operation completed successfully.");
}
}
public class OtherClass
{
public void SaveLogToMatWorkSpace(string fileName, рабочий BackgroundWorker)
{
if (indices.Count > 0)
{
двойное приращение = 100 / (double)(indices.Count - 1);
Код: Выделить всё
for (int i = 0; i < indices.Count; i++)
{
if (indices[i].Count > 0)
{
//... My code to save in MATLAB...
}
int progress = (int)Math.Ceiling(increment);
worker.ReportProgress(progress);
}
new MatFileWriter(fileName, mlList, true);
}
}
`
Подробнее здесь: https://stackoverflow.com/questions/791 ... ent-thread