Ошибка при использовании await

249
19 мая 2018, 11:40

Немного переделала.

Ошибка CS0029 Не удается неявно преобразовать тип "CookComputing.XmlRpc.XmlRpcStruct" в "System.Threading.Tasks.Task".

 private void button5_Click(object sender, EventArgs e)//КНОПКА ОБНОВИТЬ
    {
        obnovit();
    }

    public async void obnovit()  //
    {
        for (int i = 0; i < kol; i++)
        {
            int idv = idvseh[i];
            vse[ii] = await obnovit1(idv);
            ii = ii + 1;
        }
    }
    public Task<XmlRpcStruct> obnovit1(int idv)
    {
            object[] arr = proxy.get(idv);
            XmlRpcStruct arr3 = (XmlRpcStruct)arr[3];
            return arr3;// теперь здесь ошибка
    }
Answer 1

У вас в описании ошибки все написано. Метод proxy.get() возвращает массив объектов, а результат выражение после await должнен реализовывать метод GetAwaiter() (утиная типизация) Если очень хочется, то сделайте асинхронную обертку, что то типа этого:

 public Task<XmlRpcStruct> ObnovitAsync()
    {
        var tcs = new TaskCompletionSource<XmlRpcStruct>();
        Task.Run(() => {
            var result = this.obnovit1();
            tcs.SetResult(result);
        });
        return tcs.Task;
    }

Метод Obnovit очень режет глаза, может быть лучше Update

Answer 2

Судя по тому коду, что вы представили, вам вообще тут не нужна асинхронность. И вы либо убираете ее везде:

private void button5_Click(object sender, EventArgs e)//КНОПКА ОБНОВИТЬ
{
    obnovit();
}
public void obnovit()
{
    for (int i = 0; i < kol; i++)
    {
        int idv = idvseh[i];
        vse[ii] = obnovit1(idv);
        ii = ii + 1;
    }
}
public XmlRpcStruct obnovit1(int idv)
{
        object[] arr = proxy.get(idv);
        XmlRpcStruct arr3 = (XmlRpcStruct)arr[3];
        return arr3;
}

Либо делаете proxy.get() асинхронным (если это возможно) и "протягиваете" асинхронность через все методы:

private async void button5_Click(object sender, EventArgs e)//КНОПКА ОБНОВИТЬ
{
    // try/catch нужен, иначе ошибка тут может обрушить приложение или вы вообще о ней не узнаете
    try
    {
        await obnovit();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
}

public async Task obnovit()
{
    for (int i = 0; i < kol; i++)
    {
        int idv = idvseh[i];
        vse[ii] = await obnovit1(idv);
        ii = ii + 1;
    }
}
public async Task<XmlRpcStruct> obnovit1(int idv)
{
        object[] arr = await proxy.get(idv);
        XmlRpcStruct arr3 = (XmlRpcStruct)arr[3];
        return arr3;
}
READ ALSO
Unity хранение строк в одном файле

Unity хранение строк в одном файле

Делаю средний проектЗамаячила на горизонте необходимость перевести его на другой язык

245
Установка службы Windows

Установка службы Windows

При попытке установить службу получаю следующую ошибку:

318
Нехватка места на диске System.Runtime.InteropServices

Нехватка места на диске System.Runtime.InteropServices

Стала появляться следующая ошибка после переустановки с win7 на win10 :

244