相关疑难解决方法(0)

捕获在不同线程中抛出的异常

我的一个方法(Method1)产生一个新线程.该线程执行一个方法(Method2),并在exectution期间抛出异常.我需要获取有关调用方法的异常信息(Method1)

在某种程度上,我可以捕获这个Method1被抛出的异常Method2吗?

c# multithreading exception-handling

106
推荐指数
2
解决办法
9万
查看次数

在Task中捕获异常的最佳方法是什么?

有了System.Threading.Tasks.Task<TResult>,我必须管理可能抛出的异常.我正在寻找最好的方法.到目前为止,我已经创建了一个基类来管理调用中的所有未捕获的异常.ContinueWith(...)

我想知道是否有更好的方法可以做到这一点.或者即使这是一个很好的方法.

public class BaseClass
{
    protected void ExecuteIfTaskIsNotFaulted<T>(Task<T> e, Action action)
    {
        if (!e.IsFaulted) { action(); }
        else
        {
            Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
            {
                /* I display a window explaining the error in the GUI 
                 * and I log the error.
                 */
                this.Handle.Error(e.Exception);
            }));            
        }
    }
}   

public class ChildClass : BaseClass
{
    public void DoItInAThread()
    {
        var context = TaskScheduler.FromCurrentSynchronizationContext();
        Task.Factory.StartNew<StateObject>(() => this.Action())
                    .ContinueWith(e => this.ContinuedAction(e), context);
    }

    private void ContinuedAction(Task<StateObject> e)
    {
        this.ExecuteIfTaskIsNotFaulted(e, () => …
Run Code Online (Sandbox Code Playgroud)

.net c# task-parallel-library

68
推荐指数
2
解决办法
7万
查看次数

如何延迟像QTimer :: singleShot这样的C#Action?

Qt有一个简洁的功能,可以使用Lambda进行定时操作.

使用单行代码延迟后可以执行操作:

    QTimer::singleShot(10, [=](){
        // do some stuff
    });
Run Code Online (Sandbox Code Playgroud)

虽然我没有在C#中找到相同的东西.


我得到的最接近的是

Timer timer = new Timer();
timer.Interval = 10;
timer.Elapsed += (tsender, args) => { 
  // do some stuff 
  timer.Stop();
};
timer.Start();
Run Code Online (Sandbox Code Playgroud)

但它远非(视觉上)清洁.

有没有更好的方法来实现这一目标?

用例是将串行线路上的数据发送到某些硬件,点击或按下按钮时,通常需要在几毫秒后发送命令和数据包.


具有辅助功能的解决方案:

    public void DelayTask(int timeMs, Action lambda)
    {
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Interval = timeMs;
        timer.Elapsed += (tsender, args) => { lambda.Invoke(); };
        timer.AutoReset = false;
        timer.Start();
    }
Run Code Online (Sandbox Code Playgroud)

叫做

DelayTask(10, () => /* doSomeStuff...*/ );
Run Code Online (Sandbox Code Playgroud)

c#

5
推荐指数
2
解决办法
228
查看次数