小编NoP*_*God的帖子

使用HttpWebRequest发送大文件,根据需要增加/缩小缓冲区

我正在编写一个应用程序,使用HttpWebRequest将大文件上传到Web服务.

此应用程序将由具有各种Internet速度的各种人运行.

我以块的形式异步读取文件,并将这些块异步写入请求流.我使用回调在循环中执行此操作.我一直这样做,直到整个文件发送完毕.

在写入之间计算上载速度,随后更新GUI以显示所述速度.

我面临的问题是决定缓冲区大小.如果我将它设置得太大,连接速度较慢的用户将不会看到频繁的速度更新.如果我将它设置得太小,那么具有快速连接的用户将最终"锤击"读/写方法,从而导致CPU使用率飙升.

我现在正在做的是在128kb启动缓冲区,然后每10次写入我检查这10次写入的平均写入速度,如果它低于一秒钟,我将缓冲区大小增加128kb.如果写入速度低于5秒,我也会以类似的方式缩小缓冲区.

这非常有效,但这一切都让人觉得很随意,似乎还有改进的余地.我的问题是,有没有人处理类似的情况,你采取了什么行动?

谢谢

c# file-upload http httpwebrequest

6
推荐指数
1
解决办法
904
查看次数

一个可以等待的异步计数器

我有一个连接类,它有几个异步方法,如SendText,SendImage等.

连接类有一个Disconnect方法,当它被调用时,我必须注意不要在所有异步方法完成执行之前开始更改类的内部状态.

我相信实现这一目标的一个好方法是简单地保持执行中的操作数量的总计,然后当我想断开连接时我可以简单地设置Disconnecting = true然后等待计数达到0

我正在考虑这方面的事情

class ReferenceCounter
{
    void Increment();

    void Decrement();

    async Task WaitForCounterToReachZero();
}
Run Code Online (Sandbox Code Playgroud)

然后,当异步操作开始时,我可以做到

refCounter.Increment();
Run Code Online (Sandbox Code Playgroud)

当它结束

refCounter.Decrement();
Run Code Online (Sandbox Code Playgroud)

并在Disconnect方法内部

disconnecting = true;
taskCancellationSource.Cancel();
await refCounter.WaitForCounterToReachZero();
Cleanup();
Run Code Online (Sandbox Code Playgroud)

是否有像这样的内置.NET类?

或者对我来说更重要的是,有更好的方法吗?

如果它是同步代码,那就简单了

lock (thisLock)
{
    while (counter > 0)
        Monitor.Wait(thisLock);
}
Run Code Online (Sandbox Code Playgroud)

我刚刚发现内置的CountdownEvent类做了同样的事情,但它没有异步Wait方法,也没有任何事件,所以我必须阻止.

c# asynchronous task-parallel-library async-await

6
推荐指数
1
解决办法
1929
查看次数

创建Observable的正确方法是什么,该Observable将流读取到最后

我在这里挣扎.通常我会读一本书,但还没有.我已经找到了无数的使用RX读取流的各种事情的例子,但我发现很难理解.

我知道我可以使用Observable.FromAsyncPattern来创建Stream的BeginRead/EndRead或BeginReadLine/EndReadLine方法的包装器.

但这只读了一次 - 当第一个观察者订阅时.

我想要一个Observable,它将继续读取和泵送OnNext,直到流错误或结束.

除此之外,我还想知道如何与多个订阅者共享该observable,以便他们都能获得这些项目.

c# system.reactive

6
推荐指数
2
解决办法
5482
查看次数

SqlAlchemy:如何在 where 子句中使用选定子查询的结果

我希望获得文章列表以及每篇文章的评论数

我的查询看起来像这样 -

comments_subq = meta.Session.query(func.count(Comment.id)).filter(Comment.article_id==Article.id).as_scalar()

articles = meta.Session.query(Article, comments_subq.label("comment_count"))

articles = articles.filter(column('comment_count') >= 5)
Run Code Online (Sandbox Code Playgroud)

它给出了这个错误

column "comment_count" does not exist LINE 5: WHERE comment_count >= 5
Run Code Online (Sandbox Code Playgroud)

如何使用我选择的计数来过滤结果?

python sql sqlalchemy

6
推荐指数
1
解决办法
5889
查看次数

使用Entity Framework插入时有条件地设置Identity字段

我正在使用带有Entity Framework的Firebird ADO.NET提供程序,但这个问题也适用于其他提供程序.

我的模型上有一个字段如下

    [Column("JOBNO"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int JobNo { get; set; }
Run Code Online (Sandbox Code Playgroud)

在数据库中,我有一个'on insert'触发器,JOBNO如果JOBNO设置为,则使用生成器更新字段NULL

通过在我的模型字段上设置DatabaseGenerated属性DatabaseGeneratedOption.Identity,实体框架正确地JOBNO从插入数据库中提取数据.

但有时我想JOBNO在插入时手动指定列,但EF不理解并只使用生成的值.

有没有办法允许这个DataBaseGenerated字段的条件设置?

c# firebird entity-framework

6
推荐指数
1
解决办法
780
查看次数

ASP.NET MVC Windows身份验证在表单身份验证之上

我在ASP.NET MVC中开发了一个我们在内部使用的Web应用程序.现在我们希望通过互联网上的服务器提供它 - 当我们在现场做工作时,让生活更轻松.

理想情况下,我只想坚持使用Windows身份验证,以便拥有域帐户的任何人都可以登录.

问题是我已经在应用程序中使用表单身份验证.

我们对应用程序没有任何密码限制,您只需选择要登录的用户,然后提交表单.在服务器端它只是这样做 -

    FormsAuthentication.SetAuthCookie(viewModel.Username, true);
Run Code Online (Sandbox Code Playgroud)

这使用户对象(user.identity.name)在所有控制器和视图中提供用户名.

但是......当我在IIS中启用Windows身份验证时,Web应用程序开始认为user.identity.name是"ourdomain\domainuser".

我想要的是将表单身份验证与Windows身份验证结合使用,但不要以任何方式集成它们.

有没有一种简单的方法来实现这一目标?

c# iis asp.net-mvc forms-authentication windows-authentication

5
推荐指数
1
解决办法
5587
查看次数

IObserver - 调用IObserver.OnError时观察者应该做什么

我正在使用我的项目中的IObserver/ IObservableinterfaces.

CommandReader是一个IObservable连续从流中读取数据然后将其传递给它CommandHandler IObserver的数据.

当底层流关闭(例如连接死亡)时,我将通过该IObserver.OnError(exception)方法通知观察者

观察者收到此通知时应该怎么做?它应该从观察中释放出来吗?或者是父母班的责任?

c# system.reactive observer-pattern

5
推荐指数
1
解决办法
644
查看次数

自动映射器:从单个源值填充多个目标值

我的 DTO(目标)有一堆布尔值。

例如:

HasThisOption
HasThatOption
HasSomeOtherOption
Run Code Online (Sandbox Code Playgroud)

这些值是通过对模型对象(源)的字段之一进行一些计算来填充的。此计算成本有点高,因此我不想对 DTO 上的每个字段进行相同的计算,而是只想运行一次计算。

简单的解决方案是从我的控制器调用一个函数..即.. PopulateFields(source, dest)

但我不想为我的映射器配置中的每个目标字段调用 Ignore...因为大约有 40 个目标字段...而且它看起来很混乱,而且这样做真的没有任何意义。

在这种情况下,人们通常会做什么?

c# asp.net-mvc entity-framework automapper

4
推荐指数
1
解决办法
2028
查看次数

在IIS网络服务器上调用Delphi DLL的ASP.NET Web应用程序,在返回PChar字符串时锁定

如果我不返回任何内容,则工作正常,或者返回一个整数.但如果我试图返回一个PChar,即...

result := PChar('')  or   result:= PChar('Hello')
Run Code Online (Sandbox Code Playgroud)

网络应用程序只是冻结,我看着它的内存数量在任务管理器中逐渐变得越来越高.

奇怪的是,DLL在VStudio调试服务器或C#应用程序上运行良好.我唯一能想到的就是IIS服务器在64位Windows上运行.

它似乎不是一个兼容性问题,因为我可以成功写入文本文件并从DLL中执行其他操作...我只是不能返回一个PChar字符串.

尝试使用PWideChar,尝试返回'something\0',尝试了我能想到的一切.不幸的是没有运气.

[DllImport("TheLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
private static extern string SomeFunction();

string result = SomeFunction();
Run Code Online (Sandbox Code Playgroud)

德尔福:

library TheLib;

function SomeFunction() : PChar export; stdcall;
begin
return PChar('');
end;

exports
    SomeFunction
Run Code Online (Sandbox Code Playgroud)

c# delphi iis interop

4
推荐指数
1
解决办法
1978
查看次数

Firebird和Entity Framework案例敏感表/列名称

使用Firebird时,我可以查询表及其列,而无需担心案例.如果我想要区分大小写,我可以将表/列名称放在引号中.

Firebird实体框架连接器在生成查询时会自动在名称周围添加引号,因此会强制对我进行区分大小写.

这意味着我有一堆[Table("SOMETABLE")]和[Column("DESCRIPTION")]到处都是因为我现有的表名是全部大写的.

如何告诉Firebird的EF连接器不区分大小写?

ado.net firebird entity-framework

4
推荐指数
1
解决办法
602
查看次数