C# 操作超时后关闭并刷新流

C# 操作超时后关闭并刷新流,c#,timeout,filestream,roslyn,C#,Timeout,Filestream,Roslyn,我有一个写文件的函数。该函数被视为一个字符串,并使用Roslyn Emit API动态执行(因此我不确定如何访问流对象,在该对象上我可以调用close和flush方法) 问题是,有时函数可能会以死循环结束。所以我定下了执行死刑的时间 var task = Task.Run(() => execution); if (task.Wait(TimeSpan.FromSeconds(5))) return task.Result; else

我有一个写文件的函数。该函数被视为一个字符串,并使用Roslyn Emit API动态执行(因此我不确定如何访问流对象,在该对象上我可以调用close和flush方法)

问题是,有时函数可能会以死循环结束。所以我定下了执行死刑的时间

var task = Task.Run(() => execution);
        if (task.Wait(TimeSpan.FromSeconds(5)))
            return task.Result;
        else

问题是如何清理死循环留下的流,因为下一轮我将执行函数再次写入文件。它告诉我“该进程无法访问该文件,因为它正被另一个进程使用”。

Task.Wait()
只监视该任务,如果它在超时时间内出于任何原因退出(返回成功,抛出异常),则返回
true
,否则返回
false
。因此,我假设您的
using
语句从未经过
finally
,因为任务实际上从未结束。您没有“设置执行超时”,要做到这一点,任务调用的函数需要有自己的“死循环”检测,例如:它需要监视传入的取消令牌,或者您需要传入一个超时,以便它可以超时并退出(此时,您的
using
会将流刷新到文件)。我无法设置执行超时,因为它们是作为常量字符串提供的。我所做的只是通过Roslyn Emit API动态运行它们。抱歉,我不知道Roslyn Emit API。谁在给你“常量字符串”?他们需要修复代码并向您传递一个更好的字符串,因为目前它很容易出现不可恢复的无限循环。除非您可以修改正在执行的代码,否则无法“清理死循环留下的流”。嗯,您可以尝试让代码在超时后以某种方式抛出异常,然后使用的
将为您解决问题,但我认为这将很难或不可能做到。您能否将
CancellationToken
传递给该函数,并假设当它被取消时,它将得到遵守?或者,您可以将
传递给函数?
Task.Wait()
只监视任务,如果任务在超时时间内出于任何原因退出(返回成功,引发异常),则返回
true
,否则返回
false
。因此,我假设您的
using
语句从未经过
finally
,因为任务实际上从未结束。您没有“设置执行超时”,要做到这一点,任务调用的函数需要有自己的“死循环”检测,例如:它需要监视传入的取消令牌,或者您需要传入一个超时,以便它可以超时并退出(此时,您的
using
会将流刷新到文件)。我无法设置执行超时,因为它们是作为常量字符串提供的。我所做的只是通过Roslyn Emit API动态运行它们。抱歉,我不知道Roslyn Emit API。谁在给你“常量字符串”?他们需要修复代码并向您传递一个更好的字符串,因为目前它很容易出现不可恢复的无限循环。除非您可以修改正在执行的代码,否则无法“清理死循环留下的流”。嗯,您可以尝试让代码在超时后以某种方式抛出异常,然后使用
将为您解决问题,但我认为这将很难或不可能做到。您能否将
CancellationToken
传递给该函数,并假设当它被取消时,它将得到遵守?或者您可以将
传递给函数?
var task = Task.Run(() => execution);
        if (task.Wait(TimeSpan.FromSeconds(5)))
            return task.Result;
        else