C# Task.run的工作原理 Task.Run(()=> { 尝试 { runprepulation(); List timeslotsAsync=getTimeslotCompleteWebAPI(currentDate,timeslotLength,false,30,false,-1,”,maUser); TimeSlotsLocation(时隙、时隙长度、当前日期、时隙同步); } 捕获(例外情况除外) { System.IO.StreamWriter file=new System.IO.StreamWriter(“c:\\dev\\logs\\Threaderrors.txt”,true); file.Write(例如StackTrace); } });

C# Task.run的工作原理 Task.Run(()=> { 尝试 { runprepulation(); List timeslotsAsync=getTimeslotCompleteWebAPI(currentDate,timeslotLength,false,30,false,-1,”,maUser); TimeSlotsLocation(时隙、时隙长度、当前日期、时隙同步); } 捕获(例外情况除外) { System.IO.StreamWriter file=new System.IO.StreamWriter(“c:\\dev\\logs\\Threaderrors.txt”,true); file.Write(例如StackTrace); } });,c#,multithreading,C#,Multithreading,我正在做一个定制的时间表算法来帮助安排面试。这个方法是通过jQueryAjax调用调用的,该调用完成后应该将用户重新发送到主页 但是,此任务似乎锁定了我的应用程序。这导致我的应用程序在一分钟左右的时间内无法响应任何请求。为什么?我认为在线程中运行它的全部意义在于它不会锁定应用程序 当那项任务被注释掉时,问题就消失了。首先,这是在后台的单独线程上运行这些方法的正确方法吗? 这个屏幕上是否显示antyhing有意义?在我看来,它似乎试图处理一切,但线程尚未完成 “sqldatareader.clo

我正在做一个定制的时间表算法来帮助安排面试。这个方法是通过jQueryAjax调用调用的,该调用完成后应该将用户重新发送到主页

但是,此任务似乎锁定了我的应用程序。这导致我的应用程序在一分钟左右的时间内无法响应任何请求。为什么?我认为在线程中运行它的全部意义在于它不会锁定应用程序

当那项任务被注释掉时,问题就消失了。首先,这是在后台的单独线程上运行这些方法的正确方法吗?

这个屏幕上是否显示antyhing有意义?在我看来,它似乎试图处理一切,但线程尚未完成

“sqldatareader.close”旁边的奇怪图标有什么意义吗

Task.Run(() =>
{
     try
     {
         RunPrePopulation();
         List<TimeSlotInfo2> timeslotsAsync = GetTimeSlotsCompleteWebAPI(currentDate, timeslotLength, false, 30, false, -1, "", maUser);
         TimeslotsAllocation(timeslot, timeslotLength, currentDate, timeslotsAsync);
     }
     catch (Exception ex)
     {
         System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\dev\\logs\\Threaderrors.txt", true);
         file.Write(ex.StackTrace);
     }
});  
公共类OLB:IOLB
{
私有结构SlotResult
{
公共列表{get;set;}
公共列表约会{get;set;}
公共TimeSlotInfo 2 TimeSlotInfo{get;set;}
公共日期时间结束时间{get;set;}
}
私有静态只读log4net.ILog log=log4net.LogManager.GetLogger(typeof(OLB));
私有静态只读对象锁定器=新对象();
私有字符串sqlmartin=ConfigurationManager.ConnectionString[“MartinConnectionString”].ConnectionString;
private MARTINEntities martindb=新的MARTINEntities();
#可识别区域
//标志:是否已调用Dispose?
私有布尔=假;
//消费者可调用的Dispose模式的公共实现。
公共空间处置()
{
处置(真实);
总干事(本);
}
//Dispose模式的受保护实现。
受保护的虚拟void Dispose(bool disposing)
{
如果(已处置)
返回;
如果(处置)
{
Dispose();
}
//在此处释放所有非托管对象。
//
这是真的;
}
#端区可识别
每次上面的类使用Idisposable接口时,它都会显著降低速度。当它被删除时,它的工作速度会快得多

两个问题 1) 为什么我需要IDisposable
2) 为什么它会产生负面影响

我们需要看看您在这些方法调用中做了什么。否则,您是否正在对返回的
任务
执行任何操作?是的,这是将工作延迟到后台线程的正确方法。您是否正在使用
等待()等待任务
结果
?这些是阻止调用,可能会阻止您的UI。@Ageis您正在调用任务上的阻止调用,它是
等待
结果
?除非您调用
等待()
结果
从UI线程对其进行处理。除非您发布更多的代码,否则无法提供帮助。同时,在调试时,在应用程序锁定时暂停应用程序并检查调试窗口。这将显示哪些线程正在运行,每个线程在哪里,以及原因blocking@PanagiotisKanavos没有UI线程。这是ASP.NET。
 public class OLB : IOLB
{

    private struct SlotResult
    {
        public List<Schedule> Nurses { get; set; }

        public List<Schedule> Appointments { get; set; }

        public TimeSlotInfo2 TimeSlotInfo { get; set; }

        public DateTime EndTime { get; set; }
    }

    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(OLB));
    private static readonly object locker = new object();

    private string sqlmartin = ConfigurationManager.ConnectionStrings["MartinConnectionString"].ConnectionString;

    private MARTINEntities martindb = new MARTINEntities();

    #region IDisposable

    // Flag: Has Dispose already been called?
    private bool disposed = false;

    // Public implementation of Dispose pattern callable by consumers.
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // Protected implementation of Dispose pattern.
    protected virtual void Dispose(bool disposing)
    {
        if (disposed)
            return;

        if (disposing)
        {
            martindb.Dispose();
        }

        // Free any unmanaged objects here.
        //
        disposed = true;
    }

    #endregion IDisposable