我知道之前已经问过这个问题,但谷歌搜索后我得不到正确的答案.
我有这些代码行:
Task.Run(() => DoSomething())
.ContinueWith(t=>Log.Error(t,"Error"), TaskContinuationOptions.OnlyOnFaulted);
Task.Factory.StartNew(() => DoSomething())
.ContinueWith(t=>Log.Error(t,"Error"),TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)
成功运行后DoSomething
,Task.Run
投掷TaskCanceledException
时Task.Factory.StartNew
工作正常.为什么?
进一步阅读:
Stephen Clearly为什么不使用Task.Factory.StartNew
MSDN Link
更新2: 示例代码:
private async void button27_Click(object sender, EventArgs e)
{
var r = new Random(System.DateTime.Now.Millisecond);
await Task.Factory.StartNew(
() => {
Divide(r.Next(100), r.Next(-1, 10));
Log.Information("Divide Done!");
},
CancellationToken.None,
TaskCreationOptions.DenyChildAttach,
TaskScheduler.Default)
.ContinueWith(
t => {
Log.Error(t.Exception,"There is an exception on Divide");
},
TaskContinuationOptions.OnlyOnFaulted);
}
private static void Divide(int a, int b)
{
var c = a/b;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 Windows 窗体应用程序,该应用程序可以自动化旧软件。为了在该软件和我的应用程序之间传输信息,我使用剪贴板。单击旧软件上的按钮会将一些信息放入剪贴板中。
为了使用Clipboard.GetText我应该从 Windows 窗体中调用它。但我不希望一切都在 UI 线程上。
在另一个任务中调用 Clipboard.GetText 时,我得到它说你应该从 STAThread 调用 Clipboard.GetText。