相关疑难解决方法(0)

如何从C#中的同步方法调用异步方法?

我有一个public async void Foo()方法,我想从同步方法调用.到目前为止,我从MSDN文档中看到的是通过异步方法调用异步方法,但我的整个程序不是使用异步方法构建的.

这甚至可能吗?

以下是从异步方法调用这些方法的一个示例:http://msdn.microsoft.com/en-us/library/hh300224(v = vs.110).aspx

现在我正在研究从同步方法调用这些异步方法.

c# async-await

757
推荐指数
14
解决办法
54万
查看次数

无法将类型'int'隐式转换为'... Tasks <int>'

如果这是异步的,它将返回没有错误,为什么它在没有异步的情况下抛出错误,async在这个操作中毫无价值.

public Task<int> countUp()
{
    string compare = txtTag.Text;
    int count = 0;
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        if (compare == dataGridView1[0, i].Value.ToString())
        {
            BeginInvoke(new Action(() =>
            {
                count++;
                txtCount.Text = count.ToString();
            }));
        }
    }

    return count;
}
Run Code Online (Sandbox Code Playgroud)

c# task

7
推荐指数
2
解决办法
2万
查看次数

await Task.CompletedTask 是否意味着异步方法将同步运行?

static async Task WaitTaskCompleted()
{
    //Use Thread A before await Task.CompletedTask
    await Task.CompletedTask;
    //Will the code after await Task.CompletedTask always use Thread A, or there is chance to have a Thread B?
}
Run Code Online (Sandbox Code Playgroud)

这意味着await Task.CompletedTask将始终实际同步执行该方法?

c# task async-await

5
推荐指数
1
解决办法
2814
查看次数

async不需要等待的任务方法

我有一组从基类继承的命令.基类具有以下声明:

public virtual async Task Execute(object parameter){}
Run Code Online (Sandbox Code Playgroud)

继承类提供了此方法的重写,并非所有类都等待任务.在这些情况下,编译器会生成警告:

这种异步方法缺少"等待"运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.

明确提供任务完整返回值是否正确?

public override async Task Execute(object parameter) {
    //code containing no await statements...
    await Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)

c# async-await

3
推荐指数
2
解决办法
1956
查看次数

wait Task.FromResult 有什么好处吗?

我\xe2\x80\x99已经使用以下形式的代码在基线上工作:

\n\n
Var result = await Task.FromResult(_someObject.SomeNonAsyncMethod(someParameterObject));\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据我对Task.FromResult的理解,这只是将对象包装成结果形式,而不是将方法包装成任务以异步执行。因此,这些操作增加了额外的开销,但没有任何好处。

\n\n

这种理解正确吗?

\n\n

使用await 对性能有什么帮助吗?

\n\n

是否应该以这种方式使用await Task.FromResult?(考虑单独使用这条线 - 不实现接口或在测试中等)

\n\n

预先感谢您的任何见解!

\n

c# async-await c#-4.0

3
推荐指数
1
解决办法
3880
查看次数

如何正确解决警告 CS1998:此异步方法缺少“等待”(不压制它)?

我在我的应用程序中收到很多 CS1998 警告,我正在寻找如何在我的情况下解决它们。

例如,我有一个 IDataService 接口,它有一个方法签名Task<DataModel> GetData()

然后我可以说一个实现对RealDataService : IDataService文件进行一些写入/读取,并且由于它使用异步 I/O 方法来调用它们await并且方法签名更改为async Task<DataModel> GetData().

然后使用var data = await _dataService.GetData();. 到目前为止,一切都很好。

但后来我需要测试我的数据,我创建了数据接口的另一个实现,MockupDataService : IDataService其中数据只是硬编码并且不执行异步操作。一切仍然正常运行,但是在构建应用程序时,那些讨厌的 CS1998 警告开始出现。

这个问题网上有很多解决方法:

  • 禁用此类警告
  • 使用调用 await Task.Yeild();
  • 使用 Task.From 结果 -> return await Task.FromResult<DataModel>(new DataModel());
  • 我想我看过更多,但现在想不起来了。

但是这些解决方案都没有比其他解决方案“更正确”,所以我想知道解决这个问题的正确方法是什么?我知道很多人对 C# 中的异步编程有更深入的了解,并且能够就这个问题提供一些见解/答案。

c# asynchronous visual-studio async-await xamarin.forms

0
推荐指数
2
解决办法
1207
查看次数

如何返回Task &lt;int&gt;?

我有以下代码:

static void Main(string[] args)
{
    // start import process
    Task<int> task = StartImportProcess();
    task.Wait();
    // check result

    // process finished
    Console.ReadKey();
}

static async Task<int> StartImportProcess()
{
    int result = 0;
    result = await ImportCustomers();

    // some other async/await operations

    return result;
}

static Task<int> ImportCustomers()
{
    // some heavy operations

    Thread.Sleep(1000);

    return 1; // <<< what should I return?
}
Run Code Online (Sandbox Code Playgroud)

使用Taskasync/await。我想int作为任务的结果返回。我应该归还哪个对象?return 1;将无法正常工作。

c# task async-await

-2
推荐指数
1
解决办法
1104
查看次数