using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ThreadHomework.Standard;
namespace ThreadHomework
{
public class StoryStandard
{
//来个json,配置人员个数和故事个数
private static readonly object LockObj = new object();
public static void Show()
{
List<Task> taskList = new List<Task>();
List<Role> roleList = JsonHelper.ToObject<List<Role>>();
TaskFactory taskFac = new TaskFactory();
CancellationTokenSource cts = new CancellationTokenSource();
bool isMonitor = true;
Stopwatch watch = new Stopwatch();
watch.Start();
//灭世线程
Task.Run(() =>
{
Random rdm = new Random();
while (true && isMonitor)
{
if (rdm.Next(100, 2022).Equals(DateTime.Now.Year))
{
cts.Cancel();
LogHelper.Log("天降雷霆灭世,天龙八部的故事就此结束。。。");
break;
}
Thread.Sleep(500);
}
if (!isMonitor)
{
LogHelper.Log("故事结束,监控停止。。。");
}
});
int i = 0;
foreach (Role role in roleList)
{
taskList.Add(taskFac.StartNew(obj =>
{
foreach (string story in role.Plots)
{
if (i == 0)
{
lock (LockObj)
{
if (i == 0)
{
if (!cts.IsCancellationRequested)
{
LogHelper.Log(story);
LogHelper.Log("天龙八部就此拉开序幕。。。");
i = 1;
}
}
else
{
if (!cts.IsCancellationRequested)
{
LogHelper.Log(story);
}
}
}
}
else
{
if (!cts.IsCancellationRequested)
{
LogHelper.Log(story);
}
}
}
}, role.RoleName, cts.Token));
}
taskFac.ContinueWhenAny(taskList.ToArray(), t =>
{
LogHelper.Log($"{t.AsyncState}已经做好准备啦。。。");
}, cts.Token);
taskFac.ContinueWhenAll(taskList.ToArray(), t =>
{
LogHelper.Log("中原群雄大战辽兵,忠义两难一死谢天");
watch.Stop();
LogHelper.Log($"总共用了{watch.ElapsedMilliseconds}ms");
isMonitor = false;
}, cts.Token);
//Task.WaitAny(taskList.ToArray());
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ThreadHomework
{
public class LogHelper
{
private static string LogPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Log/log{DateTime.Now.ToString("yyyyMMdd")}.txt");
static LogHelper()
{
if (!Directory.Exists(Path.GetDirectoryName(LogPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(LogPath));
}
}
private static readonly object LockObj = new object();
public static void Log(string str)
{
lock (LockObj)
{
LogToFile(str);
foreach (var item in str)
{
Thread.Sleep(50);
Console.Write(item);
}
}
Console.WriteLine();
}
public static void LogToFile(string str)
{
FileStream fs = null;
StreamWriter sw = null;
try
{
fs = new FileStream(LogPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
sw = new StreamWriter(fs, Encoding.Default);
sw.WriteLine(str);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
if (sw != null)
sw.Close();
if (fs != null)
fs.Close();
}
}
}
}