我有一个public async void Foo()方法,我想从同步方法调用.到目前为止,我从MSDN文档中看到的是通过异步方法调用异步方法,但我的整个程序不是使用异步方法构建的.
这甚至可能吗?
以下是从异步方法调用这些方法的一个示例:http://msdn.microsoft.com/en-us/library/hh300224(v = vs.110).aspx
现在我正在研究从同步方法调用这些异步方法.
如果这是异步的,它将返回没有错误,为什么它在没有异步的情况下抛出错误,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) 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将始终实际同步执行该方法?
我有一组从基类继承的命令.基类具有以下声明:
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) 我\xe2\x80\x99已经使用以下形式的代码在基线上工作:
\n\nVar result = await Task.FromResult(_someObject.SomeNonAsyncMethod(someParameterObject));\nRun Code Online (Sandbox Code Playgroud)\n\n根据我对Task.FromResult的理解,这只是将对象包装成结果形式,而不是将方法包装成任务以异步执行。因此,这些操作增加了额外的开销,但没有任何好处。
\n\n这种理解正确吗?
\n\n使用await 对性能有什么帮助吗?
\n\n是否应该以这种方式使用await Task.FromResult?(考虑单独使用这条线 - 不实现接口或在测试中等)
\n\n预先感谢您的任何见解!
\n我在我的应用程序中收到很多 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();return await Task.FromResult<DataModel>(new DataModel());但是这些解决方案都没有比其他解决方案“更正确”,所以我想知道解决这个问题的正确方法是什么?我知道很多人对 C# 中的异步编程有更深入的了解,并且能够就这个问题提供一些见解/答案。
我有以下代码:
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)
使用Task和async/await。我想int作为任务的结果返回。我应该归还哪个对象?return 1;将无法正常工作。