Фоновый рабочий запуск работника завершен - PullRequest
1 голос
/ 09 мая 2011

В зависимости от метода do work мой результат может быть либо списком строк, либо списком байтов []

Как мы можем проверить RunWorkerCompletedEventArgs e -

if (e is List<String>)

это правильный способ проверки?

Ответы [ 3 ]

2 голосов
/ 09 мая 2011

Нет, это не правильный путь.
Правильный способ - использовать это:

if(e.Result is List<string>)
{
    //...
}
else if(e.Result is List<byte[]>)
{
    //...
}
else
{
    //...
}

e всегда будет иметь тип RunWorkerCompletedEventArgs. Но этот класс содержит свойство Result, которое содержит результат вашего обработчика события DoWork. Это тот, который вам нужно проверить.

2 голосов
/ 09 мая 2011

Да, это один из возможных способов сделать это.

Если у вас есть только два типа, это будет довольно просто:

if(e.Result is List<string>)
{
}
else if(e.Result is List<byte[]>)
{
}
else
{
}

Но проблема возникает, если вы играетеподдерживать больше, чем просто два или три.В этом случае я собираюсь создать Dictionary<Type, Action<object>> и написать отдельные функции для каждого типа.Примерно так:

var supportedTypes = new Dictionary<Type, Action<object>>();
supportedTypes.Add(typeof(List<string>), ComputeListOfStrings);
supportedTypes.Add(typeof(List<byte[]>), ComputeListOfByteArrays);

private void ComputeListOfString(object listOfStrings)
{
    var list = (List<string>)listOfStrings;
}

private void ComputeListOfByteArrays(object listOfByteArrays)
{
    var list = (List<byte[]>)listOfByteArrays;
}

Это упрощает поддержку новых типов и также остается O (1), в то время как if-else-if сталкивается с проблемой порядка.

Используется ли это в фоновом режиме следующим образом:

worker.OnRunWorkerCompleted += (sender, e) =>
{
    Action<object> supportedAction;

    supportedTypes.TryGetValue(e.Result.GetType(), out supportedAction);

    if(supportedAction != null)
    {
        supportedAction();
    }
};
0 голосов
/ 09 мая 2011

e.Result - это свойство с вашими результатами, поэтому вы можете получить тип, который вы можете сделать:

if(e.Result.GetType().Equals(typeof(List<String>)))
...