2012-02-14 2 views
0

если я называю этот метод секвенциальности,Дата выпуск Формат в Task Parallel Library

object[] ab = GetSomething(myObject); 

я получаю формат времени даты, как это, которое хорошо

enter image description here

знаю, если я использую TPL , для вызова этого метода

Task t1 = Task.Factory.StartNew(() => GetSomething(myObject)); 
Task t2 = Task.Factory.StartNew(() => GetSomeOtherthing(myObject)); 
Task.WaitAll(t1, t2); 

Я получаю этот формат с AM/PM, который является причиной ng to fail, говоря неверный формат даты и времени, есть способ изменить формат datetime как последовательный метод.

enter image description here

Как я преобразование строки в DATETIME

Search.Date = Convert.ToDateTime(myObject.ToDate, CultureInfo.InvariantCulture); 
+2

Что такое код для 'GetSomething', который устанавливающих' date'? –

+0

@NeilKnight iam с помощью Convert.ToDateTime (myObject.ToDate) находится в строковом формате –

+0

Следующий вопрос: что такое 'ToDate' на' myObject'? Недвижимость? Как это реализовано? Каков его тип данных? –

ответ

1

Всегда явно указать культуру при преобразовании из/в строку.

В вашем случае вероятно, что потоки threadpool имеют отличную CurrentCulture от ожидаемого.

+0

Есть ли способ изменить threadpool threads CurrentCulture на конкретный. –

+3

@ AI25 Я бы избегал этого. 'DateTime.Parse' и подобные функции имеют параметр, который принимает культуру. Используйте это. – CodesInChaos

+0

Что делать, если вы используете библиотеку, которая использует DateTime.Pars/DateTime.ToString, не передавая определенный CultureInfo ... Я думаю, вам нужно установить CurrentCulture на Thread. – Jaap

1

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

Это образец планировщик ...

class LocalizedTaskScheduler : TaskScheduler 
{ 
    public CultureInfo Culture { get; set; } 
    public CultureInfo UICulture { get; set; } 

    #region Overrides of TaskScheduler 

    protected override void QueueTask(Task task) 
    { 
     //Queue the task in the thread pool 
     ThreadPool.UnsafeQueueUserWorkItem(_ => 
     { 
      //Adjust the thread culture 
      Thread.CurrentThread.CurrentCulture = this.Culture; 
      Thread.CurrentThread.CurrentUICulture = this.UICulture; 
      //Execute the task 
      TryExecuteTask(task); 
     }, null); 
    } 

    protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) 
    { 
     if (taskWasPreviouslyQueued) 
     { 
      return false; 
     } 
     // Try to run the task. 
     return base.TryExecuteTask(task); 
    } 

    protected override IEnumerable<Task> GetScheduledTasks() 
    { 
     //We have no queue 
     return Enumerable.Empty<Task>(); 
    } 

    #endregion 
} 
Смежные вопросы