将 kestrel 控制台的输出重定向到 richtextbox
Redirect the output of kestrel's console to richtextbox
好吧,我在本地的 Kestrel 服务器上有一个 api 运行ning,我需要 运行 它而不显示控制台,所以我使用了 superuser 的 vbs 答案它起作用了,现在我的问题是我想将控制台上显示的消息流出到其他地方,如文件或 windowsform 的 richtextbox,如果有任何原因?
谢谢
您可以将 Kestrel 的输出重定向到本地文件,然后您可以观察文件的变化。
重定向 Kestrel 输出的示例:
dotnet run > d:\kestrel-output.txt
这是一个代码片段,用于查看文本文件的更改。这种方法使用时间间隔,但您可以尝试 FileSystemWatcher.
...
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var cancellationTokenSource = new CancellationTokenSource();
Load += (s, e) =>
{
const string targetFile = @"d:\kestrel-output.txt";
_ = WatchTextFileAsync(targetFile,
TimeSpan.FromSeconds(0.5),
change =>
{
Invoke(new Action(() =>
{
richTextBox1.AppendText(change);
richTextBox1.ScrollToCaret();
})
);
},
cancellationTokenSource.Token
);
};
Closing += (s, e) =>
{
if (!e.Cancel)
cancellationTokenSource.Cancel();
};
}
public async Task WatchTextFileAsync(
string path,
TimeSpan checkInterval,
Action<string> onChange,
CancellationToken token = default)
{
var fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
fs.Seek(fs.Length, SeekOrigin.Begin); //ignore current content
var sr = new StreamReader(fs);
try
{
while (!token.IsCancellationRequested)
{
if (fs.Position > fs.Length) //new file? replaced? if so read from the beginning
{
fs.Seek(0, SeekOrigin.Begin);
}
if (fs.Position < fs.Length) //check offset
{
var change = await sr.ReadToEndAsync();
onChange?.Invoke(change);
}
await Task.Delay(checkInterval, token);
}
}
finally
{
sr.Dispose();
fs.Dispose();
}
}
}
...
好吧,我在本地的 Kestrel 服务器上有一个 api 运行ning,我需要 运行 它而不显示控制台,所以我使用了 superuser 的 vbs 答案它起作用了,现在我的问题是我想将控制台上显示的消息流出到其他地方,如文件或 windowsform 的 richtextbox,如果有任何原因? 谢谢
您可以将 Kestrel 的输出重定向到本地文件,然后您可以观察文件的变化。
重定向 Kestrel 输出的示例:
dotnet run > d:\kestrel-output.txt
这是一个代码片段,用于查看文本文件的更改。这种方法使用时间间隔,但您可以尝试 FileSystemWatcher.
...
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var cancellationTokenSource = new CancellationTokenSource();
Load += (s, e) =>
{
const string targetFile = @"d:\kestrel-output.txt";
_ = WatchTextFileAsync(targetFile,
TimeSpan.FromSeconds(0.5),
change =>
{
Invoke(new Action(() =>
{
richTextBox1.AppendText(change);
richTextBox1.ScrollToCaret();
})
);
},
cancellationTokenSource.Token
);
};
Closing += (s, e) =>
{
if (!e.Cancel)
cancellationTokenSource.Cancel();
};
}
public async Task WatchTextFileAsync(
string path,
TimeSpan checkInterval,
Action<string> onChange,
CancellationToken token = default)
{
var fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
fs.Seek(fs.Length, SeekOrigin.Begin); //ignore current content
var sr = new StreamReader(fs);
try
{
while (!token.IsCancellationRequested)
{
if (fs.Position > fs.Length) //new file? replaced? if so read from the beginning
{
fs.Seek(0, SeekOrigin.Begin);
}
if (fs.Position < fs.Length) //check offset
{
var change = await sr.ReadToEndAsync();
onChange?.Invoke(change);
}
await Task.Delay(checkInterval, token);
}
}
finally
{
sr.Dispose();
fs.Dispose();
}
}
}
...