FileHelpers асинхронный с использованием MultiRecordEngine? - PullRequest
0 голосов
/ 09 октября 2018

В настоящее время я использую библиотеку FileHelpers для извлечения данных из файла фиксированной длины, используя MultiRecordEngine так же, как в документации:

var engine = new MultiRecordEngine(typeof (Orders),
typeof (Customer),
typeof (SampleType));

engine.RecordSelector = new RecordTypeSelector(CustomSelector);

var res = engine.ReadFile("Input.txt");

Согласно документации FileHelperAsyncEngine позволяет асинхронное чтение файлов строка за строкой.Однако это только для одного указанного типа T.

var engine = new FileHelperAsyncEngine<Customer>();

// Read
using(engine.BeginReadFile("Input.txt"))
{
    // The engine is IEnumerable
   foreach(Customer cust in engine)
   {
    // your code here
    Console.WriteLine(cust.Name);
   }
}

Я не смог найти ни одного примера асинхронной реализации MultiRecordEngine , не уверен, что это вообще возможно?Любое предложение или я должен просто оставить его как механизм синхронного вызова. ReadFile ()?

1 Ответ

0 голосов
/ 11 октября 2018

В MultiRecordEngine есть методы для поддержки использования асинхронного.См. Документы здесь

Есть пара примеров из библиотеки тестов исходного кода .

[Test]
public void MultpleRecordsFileAsync()
{
    engine = new MultiRecordEngine(new RecordTypeSelector(CustomSelector),
        typeof (OrdersVerticalBar),
        typeof (CustomersSemiColon),
        typeof (SampleType));

    var res = new ArrayList();
    engine.BeginReadFile(FileTest.Good.MultiRecord1.Path);
    foreach (var o in engine)
        res.Add(o);

    Assert.AreEqual(12, res.Count);
    Assert.AreEqual(12, engine.TotalRecords);

    Assert.AreEqual(typeof (OrdersVerticalBar), res[0].GetType());
    Assert.AreEqual(typeof (OrdersVerticalBar), res[1].GetType());
    Assert.AreEqual(typeof (CustomersSemiColon), res[2].GetType());
    Assert.AreEqual(typeof (SampleType), res[5].GetType());
}

[Test]
public void MultpleRecordsWriteAsync()
{
    engine = new MultiRecordEngine(new RecordTypeSelector(CustomSelector),
        typeof (OrdersVerticalBar),
        typeof (CustomersSemiColon),
        typeof (SampleType));

    object[] records = engine.ReadFile(FileTest.Good.MultiRecord1.Path);

    engine.BeginWriteFile("tempoMulti.txt");
    foreach (var o in records)
        engine.WriteNext(o);
    engine.Close();
    File.Delete("tempoMulti.txt");


    object[] res = engine.ReadFile(FileTest.Good.MultiRecord1.Path);

    Assert.AreEqual(12, res.Length);
    Assert.AreEqual(12, engine.TotalRecords);

    Assert.AreEqual(typeof (OrdersVerticalBar), res[0].GetType());
    Assert.AreEqual(typeof (OrdersVerticalBar), res[1].GetType());
    Assert.AreEqual(typeof (CustomersSemiColon), res[2].GetType());
    Assert.AreEqual(typeof (SampleType), res[5].GetType());
}
...