2015-06-30 3 views
0

Я использую ниже код для запуска поток с несколькими параметрами: магазин нить с несколькими параметрами - WPF

public Thread StartTheThread(System.Windows.Threading.Dispatcher dispatcher, int param1, string param2) 
{ 
    Thread t = new Thread(() => Work(Maingrid.Dispatcher, param1, param2)); 
    t.Start(); 
    return t; 
} 

public delegate void delegate1(Color randomparam, Color secondparam); 

public void Work(System.Windows.Threading.Dispatcher dispatcher, int param1, string param2) 
{ 
    dispatcher.Invoke(new delegate1(update), {Color.FromRgb(255, 255, 0),Color.FromRgb(170, 255, 170)}); 
} 

public void update(Color randomparam, Color secondparam) 
{ 
    ... 
} 

Создание нового потока обычно требует либо или метод «ThreadStart» «ParameterizedThreadStart». Метод Threadstart предназначен для потоков без параметров, а параметризованный метод threadstart - для потоков только с одним параметром (как объект). Но у меня разные параметры. Так как эти методы являются делегатами, я пытался сохранить нить, используя пользовательский делегат для вызова позже:

public delegate void starterdelegate(System.Windows.Threading.Dispatcher dispatcher, int param1, string param2); 

public Thread StartTheThread(int param1, string param2) 
{ 
    Thread t = new Thread(new starterdelegate(RealStart)); 
    ... 
    return t; 
} 

Но в этом случае, компилятор возвращает эту ошибку:

«разрешение перегрузки не удалось, потому что не доступна «New» можно вызвать с помощью этих аргументов: «Public Sub New (начало как System.Threading.ParameterizedThreadStart)»: значение типа «ThreadTraining.MainWindow.starterdelegate» не может быть преобразовано в «System.Threading.ParameterizedThreadStart». ' Public Sub New (начало как System.Threading.ThreadStart) ': значение типа' ThreadTraining.MainWindow.starterdelegate 'не может быть co перенаправлен на «System.Threading.ThreadStart».

Я имею в виду, что нет проблем с запуском потока с несколькими параметрами, но когда я хочу сохранить поток t, я не хочу отправлять параметры, потому что они будут изменены до следующего запуска нить. Если я использую метод ParameterizedThreadStart и не отправляю параметры, компилятор вызовет ошибку подписи. Если я не использую один из необходимых методов, компилятор вызовет ошибку с ошибкой разрешения перегрузки.

Я даже не знаю, почему это:

Thread t = new Thread(() => Work(Maingrid.Dispatcher, param1, param2)); 

работает в первую очередь. Как параметр «новая тема» совместим с методами? Я нашел эту строку кода на этой странице: https://stackoverflow.com/a/1195915/2770195

Любой совет?

+1

удалить все это и использовать 'async/await'.Кроме того, что бы вы ни делали, вы должны использовать DataBinding. –

+1

Я действительно не понимаю, чего вы хотите достичь. –

+0

@HighCore Что значит? Я не понял. – MuhsinFatih

ответ

0

Вы можете инкапсулировать параметры в классе, но вы можете инкапсулировать также свою логику в классе:

public class FooProcessor 
{ 
    private readonly Color _color1; 
    private readonly Color _color2; 

    public FooProcessor(Color color1, Color color2) 
    { 
     _color1 = color1; 
     _color2 = color2; 
    } 

    public Task ProcessAsync() 
    { 
     return Task.Run((Action) Process); 
    } 

    private void Process() 
    { 
     //add your logic here 
    } 
} 

OT: если у вас нет особых причин использовать Thread вместо Task используйте Task , В некоторых старых учебниках используются потоки, потому что в то время Task не существовало.

+0

Это похоже на работу, спасибо. Поэтому каждый раз, когда я перезаписываю FooProcessor новыми параметрами и вызываю ProcessAsync(). Но у меня есть вопрос. У меня есть тонна процессов (поток, задача, какая бы она ни была), которые имеют возможность запускаться одновременно, и все они должны быть в состоянии контролировать (приостановлено, перезаписано, прервано и т. Д.) Индивидуально и их параметры меняются со временем. (следующий комментарий): – MuhsinFatih

+0

Как вы думаете, это лучший способ их хранения? Я имею в виду, создает ли класс параметров с логикой процесса внутри и создаёт класс параметров, ссылающихся на логику процесса из основного потока, различаются в зависимости от скорости и потребляемой памяти? Все мои темы имеют одинаковую логику. (Примечание: у меня был мой комментарий, разделенный на две части, потому что stackoverflow не позволял мне печатать так долго) – MuhsinFatih

+0

Для каждого процесса вам нужно создать новый экземпляр FooProcessor. это очень важно. Если у вас много процессов, вы не должны использовать нить, а задание. Вы также можете использовать 'Parallel.Foreach' https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx – Liero

0

Использование параметра ParameterizedThreadStart Delegate. См здесь:

https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart(v=vs.110).aspx

Я думаю, вы должны создать новый класс, чтобы инкапсулировать ваши параметры и отправить новый экземпляр класса нитки в качестве параметра.

Надеюсь, что эта помощь.

+0

Это, кажется, упрощает параметры, спасибо. Но я до сих пор не понимаю, почему я не могу просто сохранить поток с несколькими параметрами, так как я могу фактически запустить поток с несколькими параметрами. Однако это тоже хорошее решение. – MuhsinFatih

+0

Как я знаю, не может передать много (более одного параметра) в поток. Кроме того, наилучшим методом является перенос ваших параметров в объект. Подумайте, есть ли у вас 15 аргументов, которые нужно передать функции, вы должны внимательно посмотреть на них, чтобы исправить свои позиции ... – hungndv

+0

Я использовал для переноса параметров в массив, но да, как вы сказали; когда у меня есть 15 параметров, трудно запомнить их позиции в массиве. Создание класса кажется гораздо более удобным. – MuhsinFatih

0

На SO был ответ на этот вопрос о передаче нескольких параметров методу ThreadStart. Мне это нравится:

static void Main(string[] args) 
    { 
     for (int i = 1; i < 24; i++) 
     { 
      Thread t = new Thread(()=>ThreadWorkingStuff(i,"2"+i.ToString())); 
      t.Start(); 
     } 
     Console.ReadKey(); 
    } 

    static void ThreadWorkingStuff(int a, string b) 
    { 
     Console.WriteLine(string.Format("Thread{2}| a={0} b={1}", a, b, Thread.CurrentThread.ManagedThreadId)); 
    } 
Смежные вопросы