这两种方法之间的语义差异是什么?
public Task DoSomething()
{
return Task.Run(() => MyFunction());
}
public async Task DoSomethingAsync()
{
await Task.Run(() => MyFunction());
}
Run Code Online (Sandbox Code Playgroud)
有什么我应该考虑在一个或另一个之间做出选择吗?
.NET 4.6
带有“异步”的带有await的调用方法与没有“异步”的相同方法之间有什么区别?
protected Task<MyObject<T>> MyMethod1<T>(string parameter)
{
return CallDb();
}
protected async Task<MyObject<T>> MyMethod2<T>(string parameter)
{
return await CallDb();
}
// Calling these
public async Task<IEnumerable<string>>(string parameter)
{
return await MyMethod1<string>(parameter);
// Any difference?
return await MyMethod2<string>(parameter);
}
public Task<string> CallDb()
{
}
Run Code Online (Sandbox Code Playgroud) 我再一次重新研究了异步任务.无论我如何设置任务,我的应用程序一直受到UI冻结的影响.我有以下代码从网页下载字符串:
internal string DownloadString(string URL)
{
var result = LoadCompanyContracts(URL);
return result.Result;
}
internal async Task<string> LoadCompanyContracts(string URL)
{
Task<string> task2 = Task<string>.Factory.StartNew(() =>
{
for (int i = 0; i <= 10000000; i++) Console.WriteLine(i);
WebClient wc = new WebClient();
string tmp = wc.DownloadString(new Uri(URL));
return tmp;
});
return task2.Result;
}
Run Code Online (Sandbox Code Playgroud)
当我执行此任务时,在for循环期间,我的应用程序的UI正在冻结.即使我相信这段代码不应该冻结UI我也无法找到解决方案.我尝试了很多不同的选项,并且真的想使用任务而不是使用webclient异步的线程或事件.
信息:我正在为我的项目使用.net 4.5.我的代码的不同之处在于这些函数在类库中(不知道它是否重要).
是否可以通过从我的代码中调用DownloadString函数来运行此代码而不用异步await阻止用户界面?如果不是什么替代品(任何好的nuget包)?
我有一个异步方法,它调用另一个异步方法,但是,我希望它在单独的线程上并行运行:
public async Task<Page> ServePage() {
Task.Run(() => DoThings(10)); // warning here
// ... other code
return new Page();
}
public async Task DoThings(int foo) {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
警告指出:
由于不等待此调用,因此在调用完成之前将继续执行当前方法。考虑将“await”运算符应用于调用结果。
事实上,这就是我正在努力做的事情。为什么我会收到编译器警告?Task.Run 的语法是否不正确?
所以我有这个WrapperFunction试图使FunctionReturningVoid被异步调用:
public async Task WrapperFunction()
{
this.FunctionReturningVoid("aParameter");
}
Run Code Online (Sandbox Code Playgroud)
这是什么都不返回的函数。在代码的某些部分(此处未详细介绍),它被称为SYNChronously,但在CallerFunction()中,我们希望它以ASYNChronously运行。
public void FunctionReturningVoid(string myString)
{
Console.Write(myString);
}
Run Code Online (Sandbox Code Playgroud)
这是已实现异步的函数,需要WrapperFunction进行操作而不阻塞otherStuff()。
public async Task CallerFunction()
{
await WrapperFunction():
int regular = otherStuff();
...
}
Run Code Online (Sandbox Code Playgroud)
IDE向我警告WrapperFunction没有使用await:
这种异步方法缺少“等待”运算符,将同步运行。考虑使用“ await”运算符来等待非阻塞API调用,或者使用“ await Task.Run(...)”来在后台线程上执行CPU绑定的工作。
问题:如何在WrapperFunction中使用异步而不使用await?如果我使用await,它告诉我不能等待void。
我有这个代码
public class ClassToTest
{
private readonly IRepository repository;
public ClassToTest(DI GOES HERE){...}
public DoSomething()
{
Task.Run(async () => {
//some code
repository.ExecuteAsync();
}
}
}
public class Repository : IRepository
{
public Task ExecuteAsync()
{
using (var connection = new SqlConnection(DbConfiguration.DatabaseConnection))
{
return connection.ExecuteAsync(storedProcedure, parameters, commandType: CommandType.StoredProcedure, commandTimeout: Configuration.TransactionTimeout);
}
}
}
[Test]
public void TestMethod()
{
var repository = new Mock<IRepository>;
var classToTest = new ClassToTest();
classToTest.DoSomething();
repository.Veryfy(p => p.ExecuteAsync(), Times.Once());
}
Run Code Online (Sandbox Code Playgroud)
测试失败并显示此消息
模拟一次的预期调用,但是是0次:p => p.ExecuteAsync()
有谁知道为什么?
谢谢