sapanagarud Ответов: 1

Многопоточность -проблема backgroundworker


Мы используем следующий код.

В базовой функции (onfinishes), если я изменю JobSummaryobj.filename, иногда обновленное значение filename не передается в launchRequest. Может кто-нибудь посоветовать, что делать?

internal virtual onfinishes(object sender, EventArgs<batchjobresult> args)
{
    JobSummary.OutputLocation = JobSummary.BaseOutputFilePath;
     RunInBackground(JobSummary);
}

private void RunInBackground(JobSummary JobSummaryobj)
{
    var backGroundWorker = new BackgroundWorker();
    backGroundWorker.DoWork += (sender, aventArgs)=>runController.launchRequest(aventArgs.Argument as JobSummary);
    backGroundWorker.RunWorkerAsync(JobSummaryobj);
}

public void launchRequest(JobSummary JobSummaryobj)
{
    // sometimes i don't get updated value here .
}


Что я уже пробовал:

Я попытался передать объект по ссылке ref

1 Ответов

Рейтинг:
2

OriginalGriff

У меня нет ваших классов, но есть быстрый тест с "абстрагированным кодом" от вашего:

private void DoIt()
    {
    var backGroundWorker = new BackgroundWorker();
    backGroundWorker.DoWork += (sender, aventArgs) => launchRequest(aventArgs.Argument as MyClass);
    backGroundWorker.RunWorkerAsync(new MyClass(1234));
    }

private void launchRequest(MyClass JobSummaryobj)
    {
    Console.WriteLine(JobSummaryobj.I);
    }
private class MyClass
    {
    public int I { get; set; }
    public MyClass(int i) { I = i; }
    }
Дайте мне последовательные результаты, как я и ожидал.

Я бы предположил, что проблема связана с вашим JobSummaryobj, а не с кодом, который вы показываете, и я бы попробовал внимательно посмотреть на него и на то, что происходит с ним до, во время и после настройки BackgroundWorker. Возможно, основной поток меняет значение на скоро или слишком поздно, и это периодически проявляется как несоответствие во вторичном потоке.

Но без всей вашей системы мы ничем не сможем вам помочь!


OriginalGriff

Затем используйте отладчик и посмотрите, каково значение RunMode...

OriginalGriff

Это не означает, что значение не изменяется после вызова RunInBackground и до вызова LaunchRequest новым потоком: вам серьезно нужно использовать отладчик на всей вашей системе, а не просто бросать нам крошечный фрагмент и надеяться, что мы сможем исправить его для вас: мы не можем.

Я понятия не имею, как вы "уже отладили", но вы можете начать смотреть на более сложные функции, которые может предложить VS, такие как точки останова данных
https://devblogs.microsoft.com/cppblog/data-breakpoints-15-8-update/
и так далее.
Мы не можем сделать это для вас!

sapanagarud

спасибо

OriginalGriff

Всегда пожалуйста!