c# - 为什么运行时不打印日志“End-Test”,但在调试时打印?
问题描述
当我运行这个测试时,不会打印日志“End-Test”,但是当我逐步调试它时,它会打印出来。这是什么原因?
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using NUnit.Framework;
namespace Tests.Integrations
{
[TestFixture]
public class Test
{
private static ConcurrentDictionary<DateTimeOffset, string> _log;
static Test()
{
_log = new ConcurrentDictionary<DateTimeOffset, string>();
}
[Test]
[TestCase("Why_End-Test_is_notPrinted")]
public async Task main(string testId)
{
LogWrite($"START-Test");
var sucssess = await SomethingSlow();
LogWrite($"END-Test, sucssess:{sucssess}");
LogSave(testId);
}
private async Task<bool> SomethingSlow()
{
return await Task<bool>.Run(() =>
{
LogWrite("Something Slow In");
for (int i = 0; i < int.MaxValue; i++) { };
LogWrite("Something Slow Out");
return true;
});
}
public void LogWrite(string msg)
{
Task.Run(() =>
{
var time = DateTimeOffset.UtcNow;
var ts = time
.ToLocalTime()
.ToString("dd/MM/yy HH:mm:ss,fffffff");
var threadId = Thread.CurrentThread.ManagedThreadId;
_log.TryAdd(time, $"{ts}-[{threadId}]: {msg}");
});
}
public void LogSave(string testId)
{
var sorted = LogSort();
string json = JsonConvert.SerializeObject(sorted, Formatting.Indented);
string Path = $"{DirectoryPath.GetDirectoryPath()}";
using (
System.IO.StreamWriter file =
new System.IO.StreamWriter($"{Path}\\ActualResults\\{testId}.json"))
{
file.WriteLine(json);
}
}
public List<string> LogSort()
{
var sortedLog = new List<string>();
var logKeys = _log.Keys.ToList();
logKeys.Sort();
logKeys.ForEach(key =>
{
string value = string.Empty;
if (_log.TryGetValue(key, out value))
sortedLog.Add(value);
});
return sortedLog;
}
}
}
未经调试的日志输出:
[
"16/08/20 11:27:34,1133986-[9]: START-Test",
"16/08/20 11:27:34,1144001-[11]: Something Slow In",
"16/08/20 11:27:39,3383941-[9]: Something Slow Out"
]
逐步调试的日志输出:
[
"16/08/20 11:29:18,8003608-[9]: START-Test",
"16/08/20 11:29:18,8033588-[10]: Something Slow In",
"16/08/20 11:29:24,1967210-[10]: Something Slow Out",
"16/08/20 11:29:35,0146056-[9]: END-Test, sucssess:True"
]
预期的结果是在逐步调试时打印在日志中的。因为我希望在主任务中等待任务“SomethingSlow()”时,在“SomethingSlow()”返回之前,不会处理主任务外壳中的剩余代码行,然后是 log(“End-Test”)应该处理。此外,线程之间的移动并不像预期的那样,因为“Something Slow In”和“Something Slow Out”这两行都在同一个任务中,所以它们必须在同一个线程中,但是在没有调试的情况下运行它不像那。
解决方案
当您在没有调试的情况下运行代码时,任务不会及时完成。所以你必须等待它。
方法LogWrite
:
public Task LogWrite(string msg)
{
return Task.Run(() =>
{
...
});
}
然后等待这个方法:
public async Task main(string testId)
{
await LogWrite($"START-Test");
var sucssess = await SomethingSlow();
await LogWrite($"END-Test, sucssess:{sucssess}");
LogSave(testId);
}
也简化SomethingSlow
方法:
private Task<bool> SomethingSlow()
{
return Task<bool>.Run(() =>
{
...
});
}
推荐阅读
- jquery - 如何停止使用 jquery 播放音频?
- c# - 我需要参考哪些包来创建我自己的 NUnit 控制台运行器?
- android - 尽管仍然显示 Activity,但 AsyncTask 中的 WeakReference 无效
- php - 部署几周后,Laravel 应用程序初始化缓慢
- python - 将自定义 css 类添加到 DataFrame 的列(或单元格)
- excel - 不同模块中的相同常量名称
- perl - UNIX - 根据主列比较 2 个文件
- android - 程序类型已经存在 :: com.google.firebase.analytics.FirebaseAnalytics$UserProperty
- reactjs - Redux 简写 `mapDispatchToProps` 返回未定义的 `async` 动作/thunk
- saucelabs - 如何将测试场景设置为在 Webdriver.io 测试对象中同时运行?