2015-01-28 2 views
1

Я хотел бы импортировать CSV-файл в свой собственный поток. Пока файл импортируется и обрабатывается, я хотел бы задержать/остановить основной поток, пока обработка не закончится. См. Код ниже:Задержка основной нити при запуске другого потока

// Read from CSV file in a seperate thread 
new Thread(() => 
{ 
    Thread.CurrentThread.IsBackground = true; 

    reader = new CSVReader(myFile); 
    reader.DataReader(); 


    // Get temperature and time data from CSV file 
    // and copy the data into each List<String> 
    Temperature = new List<string>(reader.GetTemperature()); 
    Time = new List<string>(reader.GetTime()); 

}).Start(); 

// Bind data to GridView 
dtgCsvData.ItemsSource = Time.Zip(Temperature, (t, c) => new { Time = t, Temperature = c }); 

При запуске приложения происходит ошибка, так как два списка имеют нулевое значение.

Как это достичь?

+9

Зачем беспокоиться о работе в отдельной теме? – Rawling

+1

вы должны использовать Задачи для этого ... https://msdn.microsoft.com/en-us/library/system.threading.tasks.task%28v=vs.110%29.aspx – phillip

ответ

0

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

0

Это было создано с помощью linqpad ... Вы можете использовать ключевое слово task или async следующим образом.

void Main() 
{ 
    Task<TimeAndTemp> timeAndTempTask = GetTimeAndTemp(); 
    timeAndTempTask.ContinueWith (_ => 
     { 
      timeAndTempTask.Result.Time.Dump(); 
      timeAndTempTask.Result.Temperature.Dump(); 
     }); 
} 

Task<TimeAndTemp> GetTimeAndTemp() 
{ 
    var tcs = new TaskCompletionSource<TimeAndTemp>(); 

    new Timer (_ => tcs.SetResult (new TimeAndTemp())).Change (3000, -1); 

    return tcs.Task; 
} 

public class TimeAndTemp 
{ 
    public DateTime Time = DateTime.Now; 
    public int Temperature = 32; 
} 

асинхронная версия с использованием async ждет ключевых слов.

async void Main() 
{ 
    TimeAndTemp tt = await GetTimeAndTemp(); 

    tt.Time.Dump(); 
    tt.Temperature.Dump(); 
} 

async Task<TimeAndTemp> GetTimeAndTemp() 
{ 
    return new TimeAndTemp(); 
} 

public class TimeAndTemp 
{ 
    public DateTime Time = DateTime.Now; 
    public int Temperature = 32; 
} 
Смежные вопросы